人民币转换为中文大写

来源:互联网 发布:收到淘宝重置密码短信 编辑:程序博客网 时间:2024/05/17 04:12
自己整理
JavaScript版:


function cmycurd(num){  //转成人民币大写金额形式
  var str1 = '零壹贰叁肆伍陆柒捌玖';  //0-9所对应的汉字
  var str2 = '万仟佰拾亿仟佰拾万仟佰拾元角分'; //数字位所对应的汉字
  var str3;    //从原num值中取出的值
  var str4;    //数字的字符串形式
  var str5 = '';  //人民币大写金额形式
  var i;    //循环变量
  var j;    //num的值乘以100的字符串长度
  var ch1;    //数字的汉语读法
  var ch2;    //数字位的汉字读法
  var nzero = 0;  //用来计算连续的零值是几个
 
  num = Math.abs(num).toFixed(2);  //将num取绝对值并四舍五入取2位小数
  str4 = (num * 100).toFixed(0).toString();  //将num乘100并转换成字符串形式
  j = str4.length;      //找出最高位
  if (j > 15){return '溢出';}
  str2 = str2.substr(15-j);    //取出对应位数的str2的值。如:200.55,j为5所以str2=佰拾元角分
 
  //循环取出每一位需要转换的值
  for(i=0;i<j;i++){
    str3 = str4.substr(i,1);   //取出需转换的某一位的值
    if (i != (j-3) && i != (j-7) && i != (j-11) && i != (j-15)){    //当所取位数不为元、万、亿、万亿上的数字时
   if (str3 == '0'){
     ch1 = '';
     ch2 = '';
  nzero = nzero + 1;
   }
   else{
     if(str3 != '0' && nzero != 0){
       ch1 = '零' + str1.substr(str3*1,1);
          ch2 = str2.substr(i,1);
          nzero = 0;
  }
  else{
    ch1 = str1.substr(str3*1,1);
          ch2 = str2.substr(i,1);
          nzero = 0;
        }
   }
 }
 else{ //该位是万亿,亿,万,元位等关键位
      if (str3 != '0' && nzero != 0){
        ch1 = "零" + str1.substr(str3*1,1);
        ch2 = str2.substr(i,1);
        nzero = 0;
      }
      else{
     if (str3 != '0' && nzero == 0){
          ch1 = str1.substr(str3*1,1);
          ch2 = str2.substr(i,1);
          nzero = 0;
  }
        else{
    if (str3 == '0' && nzero >= 3){
            ch1 = '';
            ch2 = '';
            nzero = nzero + 1;
       }
       else{
      if (j >= 11){
              ch1 = '';
              nzero = nzero + 1;
   }
   else{
     ch1 = '';
     ch2 = str2.substr(i,1);
     nzero = nzero + 1;
   }
          }
  }
   }
 }
    if (i == (j-11) || i == (j-3)){  //如果该位是亿位或元位,则必须写上
        ch2 = str2.substr(i,1);
    }
    str5 = str5 + ch1 + ch2;
   
    if (i == j-1 && str3 == '0' ){   //最后一位(分)为0时,加上“整”
      str5 = str5 + '整';
    }
  }
  if (num == 0){
    str5 = '零元整';
  }
  return str5;
}

c#版

using System;

namespace ExpertLib.ChineseSpecial
{
    #region RMBException
    /// <summary>
    /// 人民币转换的错误
    /// </summary>
    public class RMBException : System.Exception
    {
        public RMBException(string msg)
            : base(msg)
        {
        }
    }
    #endregion

    /// <summary>
    /// 实现将人民币的数字形式转换为中文格式,最大支持9兆兆。
    /// </summary>
    public static class RMB
    {
        #region 内部常量
        private static string RMBUppercase = "零壹贰叁肆伍陆柒捌玖";
        private static string RMBUnitChar = "元拾佰仟万拾佰仟亿拾佰仟兆拾佰仟万拾佰仟亿拾佰仟兆"; //人民币整数位对应的标志
        private const decimal MaxNumber =9999999999999999999999999.99m;
        private const decimal MinNumber = -9999999999999999999999999.99m;
        private static char[] cDelim = { '.' }; //小数分隔标识
        #endregion

        #region Convert
        #region Convert <decimal>
        /// <summary>
        /// 转换成人民币大写形式
        /// </summary>
        /// <param name="digital"></param>
        /// <returns></returns>
        public static string Convert(decimal number)
        {
            bool NegativeFlag=false;
            decimal RMBNumber;

            CheckNumberLimit(number);

            RMBNumber = Math.Round(number, 2);    //将四舍五入取2位小数
            if (RMBNumber == 0)
   {
    return "零元整";
   }
   else if(RMBNumber < 0)  //如果是负数
   {
    NegativeFlag = true;
                RMBNumber = Math.Abs(RMBNumber);           //取绝对值
   }
   else
   {
                NegativeFlag = false;
   }

            string buf = "";                           // 存放返回结果
            string strDecPart = "";                    // 存放小数部分的处理结果
            string strIntPart = "";                    // 存放整数部分的处理结果
            string[] tmp = null;
            string strDigital = RMBNumber.ToString();
           
            tmp = strDigital.Split(cDelim, 2); // 将数据分为整数和小数部分

           
            if (RMBNumber >= 1m) // 大于1时才需要进行整数部分的转换
            {
                strIntPart = ConvertInt(tmp[0]);
            }

            if (tmp.Length > 1) //分解出了小数
            {
                strDecPart = ConvertDecimal(tmp[1]);
            }
            else  //没有小数肯定是为整
            {
                strDecPart = "整";
            }
           
            if (NegativeFlag==false) //是否负数
            {
                buf = strIntPart + strDecPart;
            }
            else
            {
                buf = "负"+strIntPart + strDecPart;
            }
            return buf;
        }
        #endregion

        #region Convert <double>
        /// <summary>
        /// 转换成人民币大写形式
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string Convert(double number)
        {
            decimal dec;
            try
            {
                dec = System.Convert.ToDecimal(number);
            }
            catch
            {
                throw new RMBException("不能转成标准的decimal类型:" + number.ToString());
            }
            return Convert(dec);
        }
        #endregion

        #region Convert <float>
        /// <summary>
        /// 转换成人民币大写形式
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string Convert(float number)
        {
            decimal dec;
            try
            {
                dec = System.Convert.ToDecimal(number);
            }
            catch
            {
                throw new RMBException("不能转成标准的decimal类型:" + number.ToString());
            }
            return Convert(dec);
        }
        #endregion

        #region Convert <int>
        /// <summary>
        /// 转换成人民币大写形式
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string Convert(int number)
        {
            decimal dec;
            dec = System.Convert.ToDecimal(number);
            return Convert(dec);
        }
        #endregion

        #region Convert <long>
        /// <summary>
        /// 转换成人民币大写形式
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string Convert(long number)
        {
            decimal dec;
            dec = System.Convert.ToDecimal(number);
            return Convert(dec);
        }
        #endregion

        #region Convert <string>
        /// <summary>
        /// 转换成人民币大写形式
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string Convert(string number)
        {
            decimal dec;
            try
            {
                dec = System.Convert.ToDecimal(number,null);
            }
            catch
            {
                throw new RMBException("不能转成标准的decimal类型:" + number);
            }
            return Convert(dec);
        }
        #endregion
        #endregion

        #region MaxSupportNumber
        /// <summary>
        /// 支持的最大转换数
        /// </summary>
        public static decimal MaxSupportNumber
        {
            get
            {
                return MaxNumber;
            }
        }
        #endregion

        #region MinSupportNumber
        /// <summary>
        /// 支持的最小数
        /// </summary>
        public static decimal MinSupportNumber
        {
            get
            {
                return MinNumber;
            }
        }
        #endregion

        #region 内部函数
        #region ConvertInt
        private static string ConvertInt(string intPart)
        {
            string buf = "";
            int length = intPart.Length;
            int curUnit = length;
   
            // 处理除个位以上的数据
            string tmpValue = "";                    // 记录当前数值的中文形式
            string tmpUnit = "";                    // 记录当前数值对应的中文单位
            int i;
            for (i = 0; i < length - 1; i++, curUnit--)
            {
                if (intPart[i] != '0')
                {
                    tmpValue = DigToCC(intPart[i]);
                    tmpUnit = GetUnit(curUnit - 1);
                }
                else
                {                   
                    // 如果当前的单位是"万、亿",则需要把它记录下来
                    if ((curUnit - 1) % 4 == 0)
                    {
                        tmpValue = "";
                        tmpUnit = GetUnit(curUnit - 1);//
                       
                    }
                    else
                    {
                        tmpUnit = "";
                       
                        // 如果当前位是零,则需要判断它的下一位是否为零,再确定是否记录'零'
                        if (intPart[i + 1] != '0')
                        {
                           
                            tmpValue = "零";
                           
                        }
                        else
                        {
                            tmpValue = "";
                        }
                    }
                }
                buf += tmpValue + tmpUnit;
            }

           
            // 处理个位数据
            if (intPart[i] != '0')
                buf += DigToCC(intPart[i]);
            buf += "元";

            return CombinUnit(buf);
        }
        #endregion

        #region ConvertDecimal
        /// <summary>
        /// 小数部分的处理
        /// </summary>
        /// <param name="decPart">需要处理的小数部分</param>
        /// <returns></returns>
        private static string ConvertDecimal(string decPart)
        {
            string buf = "";
            int i = decPart.Length;

            //如果小数点后均为零
            if ((decPart == "0") || (decPart == "00"))
            {
                return "整";
            }

            if (decPart.Length > 1) //2位
            {
                if (decPart[0] == '0') //如果角位为零0.01
                {
                    buf = DigToCC(decPart[1]) + "分"; //此时不可能分位为零
                }
                else if (decPart[1] == '0')
                {
                    buf = DigToCC(decPart[0]) + "角整";
                }
                else
                {
                    buf = DigToCC(decPart[0]) + "角";
                    buf += DigToCC(decPart[1]) + "分";
                }
            }
            else //1位
            {
                buf += DigToCC(decPart[0]) + "角整";
            }
            return buf;
        }
        #endregion

        #region GetUnit
        /// <summary>
        /// 获取人民币中文形式的对应位置的单位标志
        /// </summary>
        /// <param name="n"></param>
        /// <returns></returns>
        private static string GetUnit(int n)
        {
            return RMBUnitChar[n].ToString();
        }
        #endregion

        #region DigToCC
        /// <summary>
        /// 数字转换为相应的中文字符 ( Digital To Chinese Char )
        /// </summary>
        /// <param name="c">以字符形式存储的数字</param>
        /// <returns></returns>
        private static string DigToCC(char c)
        {
            return RMBUppercase[c - '0'].ToString();
        }
        #endregion

        #region CheckNumberLimit
        private static void CheckNumberLimit(decimal number)
        {
            if ((number < MinNumber) || (number > MaxNumber))
            {
                throw new RMBException("超出可转换的范围");
            }
        }
        #endregion

        #region CombinUnit
        /// <summary>
        /// 合并兆亿万词
        /// </summary>
        /// <param name="rmb"></param>
        /// <returns></returns>
        private static string CombinUnit(string rmb)
        {
            if (rmb.Contains("兆亿万"))
            {
                return rmb.Replace("兆亿万", "兆");
            }
            if (rmb.Contains("亿万"))
            {
                return rmb.Replace("亿万", "亿");
            }
            if (rmb.Contains("兆亿"))
            {
                return rmb.Replace("兆亿", "兆");
            }
            return rmb;   
        }
        #endregion
        #endregion
    }
}

原创粉丝点击