JS实现数字转换为货币汉字大写数字的方法详解
2011-04-12 15:40
801 查看
JS实现数字转换为货币汉字大写数字的方法详解
-------------------源码解析---------------------------------
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; //最后返回“镹亿零三百二十万五千零三十四圆一角二分元整”
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/REBELASDF/archive/2010/09/09/5874190.aspx
function Chinese(num){ if(!/^\d*(\.\d*)?$/.test(num))throw(new Error(-1, "Number is wrong!")); var AA = new Array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖"); var BB = new Array("","拾","佰","仟","萬","億","圆",""); var CC = new Array("角", "分", "厘"); var a = (""+ num).replace(/(^0*)/g, "").split("."), k = 0, re = ""; for(var i=a[0].length-1; i>=0; i--){ switch(k){ case 0 : re = BB[7] + re; break; case 4 : if(!new RegExp("0{4}\\d{"+ (a[0].length-i-1) +"}$").test(a[0])) re = BB[4] + re; break; 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; if(a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k%4] + re; k++; } 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; } if(a[1].charAt(0)=="0" && a[1].charAt(1)=="0"){ re+="元整"; } }else{ re+="元整"; } 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; //最后返回“镹亿零三百二十万五千零三十四圆一角二分元整”
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/REBELASDF/archive/2010/09/09/5874190.aspx
相关文章推荐
- JS实现数字转换为货币汉字大写数字的方法详解
- JS实现数字转换为货币汉字大写数字
- JS实现将数字金额转换为大写人民币汉字的方法
- JS实现汉字与Unicode码相互转换的方法详解
- C#实现将浮点数表示的货币数量以汉字大写形式输出的方法
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- js实现小写数字转换为大写的方法
- C#基于纯数学方法递归实现货币数字转换中文功能详解
- 利用node.js实现自动生成前端项目组件的方法详解
- 详解原生js实现offset方法
- JS实现滑动门效果的方法详解
- js实现文本框只允许输入数字并限制数字大小的方法
- JS使用parseInt解析数字实现求和的方法
- JS实现加载和读取XML文件的方法详解
- 前端跨域问题相关知识详解(原生js和jquery两种方法实现jsonp跨域)
- js里实现给数字加三位一逗号间隔的两种方法
- JS实现数字千位符格式化方法
- JS实现数字格式千分位相互转换方法
- JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
- JS延时提示框实现方法详解