javascript实现阿拉伯数字和中文数字字符互相转化

中文数字的特点

  1. 中文数字以10000为一个节权位,例如万、亿。
  2. 在节权位内部又有十、百、千三个权位。
  3. 节权位可以和其他权位同时出现,而十、百、千不能同时出现。

中文数字中零的使用规则

  1. 只要不是第一个小节,例如(1-999),千位是0,都要补零。
  2. 两个非零数字之间,若有零,需要补零。
  3. 小节的结尾是零,不要补零。

阿拉伯数字转中文数字的算法说明

  1. 对零的第一个使用规则的实现,把检测放在循环最前面并默认为false,可以自然丢弃最高小节的加零判断。
  2. 单个数字转换用数组实现,["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]。
  3. 节权位转化也用数组实现,["", "万", "亿", "万亿", "亿亿"]。
  4. 普通权威同样用数组实现,["", "十", "百", "千"]。

每个小节的转化算法

var sectionToChinese = function(section){
    var strIns = '',
    chnStr = '',
    unitPos = 0,
    zero = true;
    while(section > 0){
        var v = section % 10;
        if (v === 0) {
            if (!zero) {
                zero = true;
                chnStr = chineseNumChar[v] + chnStr;
            }
        }else{
                zero = false;
                strIns = chineseNumChar[v];
                strIns += chineseUnitChar[unitPos];
                chnStr = strIns + chnStr;
            }
            unitPos++;
            section = Math.floor(section / 10);
        }
        return chnStr;
    };

转化主函数

var numberToChines = function() {
    var unitPos = 0,
    strIns = '',
    chnStr = '',
    needZero = false;

    if (num === 0) {
        return chineseNumChar[0];
    }

    while(num > 0){
        var section = num % 10000;
        if (needZero) {
            chnStr = chineseNumChar[0] + chnStr;
        }
        strIns = sectionToChinese(section);
        strIns += (section !== 0) ? chineseUnitSection[unitPos] : chineseUnitSection[0];
        chnStr = strIns + chnStr;
        needZero = (section < 1000) && (section > 0);
        num = Math.floor(num / 10000);
        unitPos++;
    }
    return chnStr;
};

中文数字转阿拉伯数字的实现

  1. 将中文权位转化为10的位数。
  2. 对每个权位依次转化为位数并求和。
  3. 零直接忽略即可。

中文数字转阿拉伯数字用以下对象实现:

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

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

var chnNameValue = {
  十:{value:10, secUnit:false},
  百:{value:100, secUnit:false},
  千:{value:1000, secUnit:false},
  万:{value:10000, secUnit:true},
  亿:{value:100000000, secUnit:true}
}

算法实现:

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;
}
posted @ 2017-02-20 15:50  snicker  阅读(1672)  评论(1编辑  收藏  举报