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;
}