JS实现数字转换为货币汉字大写数字的方法详解

来源:互联网 发布:天天特价淘宝 编辑:程序博客网 时间:2024/05/16 06:30

转载自:http://liufei0819.blog.51cto.com/1802455/542671

 

JS实现数字转换为货币汉字大写数字的方法详解

  1. function Chinese(num){     
  2.     if(!/^\d*(\.\d*)?$/.test(num))throw(new Error(-1, "Number is wrong!"));     
  3.     var AA = new Array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");     
  4.     var BB = new Array("","拾","佰","仟","萬","億","圆","");     
  5.     var CC = new Array("角""分""厘");     
  6.     var a = (""+ num).replace(/(^0*)/g, "").split("."), k = 0, re = "";     
  7.     for(var i=a[0].length-1; i>=0; i--){     
  8.         switch(k){     
  9.             case 0 : re = BB[7] + re; break;     
  10.             case 4 : if(!new RegExp("0{4}\\d{"+ (a[0].length-i-1) +"}$").test(a[0]))     
  11.                          re = BB[4] + re; break;     
  12.             case 8 : re = BB[5] + re; BB[7] = BB[5]; k = 0; break;     
  13.         }     
  14.         if(k%4 == 2 && a[0].charAt(i)=="0" && a[0].charAt(i+2) != "0") re = AA[0] + re;     
  15.         if(a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k%4] + re; k++;     
  16.     }     
  17.     if(a.length>1){     
  18.         re += BB[6];     
  19.         for(var i=0; i<a[1].length; i++){     
  20.             re += AA[a[1].charAt(i)] + CC[i];     
  21.             if(i==2) break;     
  22.         }   
  23.         if(a[1].charAt(0)=="0" && a[1].charAt(1)=="0"){  
  24.             re+="元整";  
  25.         }    
  26.     }else{  
  27.         re+="元整";  
  28.     }     
  29.     return re;     

 

-------------------源码解析---------------------------------
function conver(num)  

  { 
          var AA = new Array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");   ////先创建一个数组放入是个大写数字

          var BB = new Array("","拾","佰","仟","萬","億","圆","");   ////在将圆以上单位放入一个数组中

          var CC = new Array("角", "分", "厘");   ///将圆以下单位放入一个数组中

          var a = (""+num).replace(/(^0*)/g, "").split("."), k = 0, re = ""; //两个“/###/”之间定义了正则表达式
  //以若干个0开始的数字,前面的0全部以空替换。如何00023就被转换为23,之后再以"."分割,所以这里的a是一个数组元素
  //在定义两个元素,一个 k 一个是 re。
          for(var i=a[0].length-1; i>=0; i--)   /////这里是转换整数的情况

          {  

                  switch(k)   ///判断当k等于0/4/8的情况,

                  {  

                          case 0 : re = BB[7] + re; break;   ///当k等于0时,re就定于“”

                          case 4 : if(!new RegExp("0{4}\\d{"+ (a[0].length-i-1) +"}$").test(a[0])) ///RegExp是创建正则表达式的对象
     //test 方法 返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式。
     //这个判断条件的意思就是判断这个RegExp对象在a[0]中是否出现过也就是“0{4}\d{4}”这个正则是否在a[0]中出现
     //如果出现条件为假整个四位万位都为空,就不用写万位了。直接从亿到到千,如200002325就读二亿两千三百二十五
                                            re = BB[4] + re; break;   ///当k等于4时,re等于“万” 如果条件为真执行这条语句

                          case 8 : re = BB[5] + re; BB[7] = BB[5]; k = 0; break; ///判断如果超过亿就另说了!哇哈哈 

                  }  

                  if(k%4 == 2 && a[0].charAt(i)=="0" && a[0].charAt(i+2) != "0") re = AA[0] + re;  
   ///当k除4余2和a[0]的第i个元素等于0还有a[0]的第i+2个元素不等于0同时成立时,re就等于AA[0]+re


                  if(a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k%4] + re; k++;  
   ///如果a[0]第i个元素不等于0;就让re等于(数组AA下标等于a[0].charAt(i)的元素 + 数组BB[k%4]的元素 + re)然后让k++,

 

   ///*例如当输入      903205034.12      时,
  ///第一轮循环 i=8 
   switch(k)中k=0,先得到re="";
   然后执行if(k%4 == 2 && a[0].charAt(i)=="0" && a[0].charAt(i+2) != "0")判断了条件为假跳过往下执行
   执行 if(a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k%4] + re; k++; 判断条件为真执行if语句
   得到AA[4] + BB[0%4] + ""; k=1;得到re="肆"
  ///第二轮循环 i=7 
   switch(k)中k=1,没有匹配的case;跳过switch往下执行
   然后执行if(1%4 == 2 && a[0].charAt(7)=="0" && a[0].charAt(7+2) != "0")判断了条件为假跳过往下执行
   执行 if(a[0].charAt(7) != 0) re = AA[a[0].charAt(7)] + BB[1%4] + re; k++; 判断条件为真执行if语句
   得到AA[3] + BB[1] + "肆"; k=2;得到re="叁"+"拾"+"肆"
  ///第三轮循环 i=6
   switch(2)没有匹配的case;跳过switch往下执行
   然后执行if(2%4 == 2 && a[0].charAt(6)=="0" && a[0].charAt(6+2) != "0")判断了条件为真往下执行
   re = AA[0] + "叁"+"拾"+"肆"; re="零" + "叁"+"拾"+"肆"
   执行 if(a[0].charAt(6) != 0) re = AA[a[0].charAt(6)] + BB[2%4] + re; k++; 判断条件为假跳回
  ///第四轮循环 i=5
   switch(3)没有匹配的case;跳过switch往下执行
   然后执行if(3%4 == 2 && a[0].charAt(6)=="0" && a[0].charAt(6+2) != "0")判断了条件为假跳过往下执行
   执行 if(a[0].charAt(5) != 0) re = AA[a[0].charAt(5)] + BB[3%4] + re; k++; 判断条件为真执行if语句
   得到AA[5] + BB[3] + "叁"+"拾"+"肆"; k=4;得到re="伍"+"仟"+"零"+"叁"+"拾"+"肆"
  ///第五轮循环 i=4
   switch(4)匹配的case=4;执行
   然后执行if(3%4 == 2 && a[0].charAt(6)=="0" && a[0].charAt(6+2) != "0")判断了条件为假跳过往下执行
   执行 if(a[0].charAt(5) != 0) re = AA[a[0].charAt(5)] + BB[3%4] + re; k++; 判断条件为真执行if语句
   得到AA[5] + BB[3] + "叁"+"拾"+"肆"; k=4;得到re="伍"+"仟"+"零"+"叁"+"拾"+"肆"
  以此类推..........最后得到re=镹亿零三百二十万五千零三十四*/
 
   

          }  
 
          if(a.length>1) //加上小数部分(如果有小数部分)这个是转换小数点后面的几位

          {

                  re += BB[6];     //镹亿零三百二十万五千零三十四+圆

                  for(var i=0; i<a[1].length; i++)  

                  {  

                      re += AA[a[1].charAt(i)] + CC[i];

                      if(i==2) break;  

                  }     ///循环结束后re=镹亿零三百二十万五千零三十四圆一角二分
   if(a[1].charAt(0)=="0" && a[1].charAt(1)=="0")///这个if是判断如果没有角和分只有厘则忽略厘加上元整

   {

   re+="元整";
 
   } 

          }

  else  ///如果不带小数也输出

  {

   re+="元整";

  }  

          return re;   //最后返回“镹亿零三百二十万五千零三十四圆一角二分元整”

  }

0 0