JavaScript实现阿拉伯数字和中文数字互相转换

JavaScript实现阿拉伯数字和中文数字互相转换


作者:zhoutk 字体:[增加 减小] 类型:转载 时间:2016-06-12 我要评论

JavaScript实现阿拉伯数字和中文数字互相转换可以用数组的循环检测后的替换来实现,下面主要讲解其中的一些核心算法:

阿拉伯数字转中文数字
中文数字的特点:

  • 每个计数数字都跟着一个权位,权位有:十、百、千、万、亿。
  • 以“万”为小节,对应一个节权位,万以下没有节权位。
  • 每个小节内部以“十百千”为权位独立计数。
  • “十百千”不能连续出现,而“万”和“亿”作为节权位时可以和其他权位连用,如:“二十亿”。

中文数字对“零”的使用要满足以下三条规则:

  • 以10000为小节,小节的结尾即使是0,也不使用零。
  • 小节内两个非0数字之间要使用“零”。
  • 当小节的“千”位是0时(即:1~999),只要不是首小节,都要补“零”。

算法设计的一些说明:

  • 对“零”的第三个规则,把检测放在循环的最前面并默认为false,可以自然的丢弃最高小节的加零判断。
  • 单个数字转换用数组实现,var chnNumChar = ["零","一","二","三","四","五","六","七","八","九"];
  • 节权位同样用数组实现,var chnUnitSection = ["","万","亿","万亿","亿亿"];
  • 节内权位同样用数组实现,var chnUnitChar = ["","十","百","千"];

节内转换算法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function SectionToChinese(section){
   var strIns = '' , chnStr = '' ;
   var unitPos = 0;
   var zero = true ;
   while (section > 0){
     var v = 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);
   }
   return chnStr;
}

转换算法主函数:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function NumberToChinese(num){
   var unitPos = 0;
   var strIns = '' , chnStr = '' ;
   var needZero = false ;
 
   if (num === 0){
     return chnNumChar[0];
   }
 
   while (num > 0){
     var section = 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++;
   }
 
   return chnStr;
}

中文数字转阿拉伯数字
设计思想:

  • 将中文数学转换成阿拉伯数字。
  • 将中文权位转换成10的位数。
  • 对每个权位依次转换成位数并求和。
  • 零直接忽略即可。

中文数字转换成阿拉伯数字用如下对象实现:

?
1
2
3
4
5
6
7
8
9
10
11
12
var chnNumChar = {
   零:0,
   一:1,
   二:2,
   三:3,
   四:4,
   五:5,
   六:6,
   七:7,
   八:8,
   九:9
};

中文权位转换成10的位数及节权标志用如下对象实现:

?
1
2
3
4
5
6
7
var chnNameValue = {
   十:{value:10, secUnit: false },
   百:{value:100, secUnit: false },
   千:{value:1000, secUnit: false },
   万:{value:10000, secUnit: true },
   亿:{value:100000000, secUnit: true }
}

转换算法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function ChineseToNumber(chnStr){
   var rtn = 0;
   var section = 0;
   var number = 0;
   var secUnit = false ;
   var str = chnStr.split( '' );
 
   for ( var i = 0; i < str.length; i++){
     var num = chnNumChar[str[i]];
     if ( typeof num !== 'undefined' ){
       number = num;
       if (i === str.length - 1){
         section += number;
       }
     } else {
       var unit = 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;
     }
   }
   return rtn + section;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值