JavaScript实现阿拉伯数字和中文数字互相转换
阿拉伯数字转中文数字
中文数字的特点:
- 每个计数数字都跟着一个权位,权位有:十、百、千、万、亿。
- 以“万”为小节,对应一个节权位,万以下没有节权位。
- 每个小节内部以“十百千”为权位独立计数。
- “十百千”不能连续出现,而“万”和“亿”作为节权位时可以和其他权位连用,如:“二十亿”。
中文数字对“零”的使用要满足以下三条规则:
- 以10000为小节,小节的结尾即使是0,也不使用零。
- 小节内两个非0数字之间要使用“零”。
- 当小节的“千”位是0时(即:1~999),只要不是首小节,都要补“零”。
算法设计的一些说明:
- 对“零”的第三个规则,把检测放在循环的最前面并默认为false,可以自然的丢弃最高小节的加零判断。
- 单个数字转换用数组实现,varchnNumChar=["零","一","二","三","四","五","六","七","八","九"];
- 节权位同样用数组实现,varchnUnitSection=["","万","亿","万亿","亿亿"];
- 节内权位同样用数组实现,varchnUnitChar=["","十","百","千"];
节内转换算法:
functionSectionToChinese(section){ varstrIns='',chnStr=''; varunitPos=0; varzero=true; while(section>0){ varv=section%10; if(v===0){ if(!zero){ zero=true; chnStr=chnNumChar[v]+chnStr; } }else{ zero=false; strIns=chnNumChar[v]; strIns+=chnUnitChar[unitPos]; chnStr=strIns+chnStr; } unitPos++; section=Math.floor(section/10); } returnchnStr; }
转换算法主函数:
functionNumberToChinese(num){ varunitPos=0; varstrIns='',chnStr=''; varneedZero=false; if(num===0){ returnchnNumChar[0]; } while(num>0){ varsection=num%10000; if(needZero){ chnStr=chnNumChar[0]+chnStr; } strIns=SectionToChinese(section); strIns+=(section!==0)?chnUnitSection[unitPos]:chnUnitSection[0]; chnStr=strIns+chnStr; needZero=(section<1000)&&(section>0); num=Math.floor(num/10000); unitPos++; } returnchnStr; }
中文数字转阿拉伯数字
设计思想:
- 将中文数学转换成阿拉伯数字。
- 将中文权位转换成10的位数。
- 对每个权位依次转换成位数并求和。
- 零直接忽略即可。
中文数字转换成阿拉伯数字用如下对象实现:
varchnNumChar={ 零:0, 一:1, 二:2, 三:3, 四:4, 五:5, 六:6, 七:7, 八:8, 九:9 };
中文权位转换成10的位数及节权标志用如下对象实现:
varchnNameValue={ 十:{value:10,secUnit:false}, 百:{value:100,secUnit:false}, 千:{value:1000,secUnit:false}, 万:{value:10000,secUnit:true}, 亿:{value:100000000,secUnit:true} }
转换算法如下:
functionChineseToNumber(chnStr){ varrtn=0; varsection=0; varnumber=0; varsecUnit=false; varstr=chnStr.split(''); for(vari=0;i<str.length;i++){ varnum=chnNumChar[str[i]]; if(typeofnum!=='undefined'){ number=num; if(i===str.length-1){ section+=number; } }else{ varunit=chnNameValue[str[i]].value; secUnit=chnNameValue[str[i]].secUnit; if(secUnit){ section=(section+number)*unit; rtn+=section; section=0; }else{ section+=(number*unit); } number=0; } } returnrtn+section; }