阿拉伯数字与中文数字的转换(javascript实现)

8

此为《算法的乐趣》读书笔记,我用javascript重新实现算法。

阿拉伯数字转中文数字

中文数字的特点:

  • 每个计数数字都跟着一个权位,权位有:十、百、千、万、亿。

  • 以“万”为小节,对应一个节权位,万以下没有节权位。

  • 每个小节内部以“十百千”为权位独立计数。

  • “十百千”不能连续出现,而“万”和“亿”作为节权位时可以和其他权位连用,如:“二十亿”。

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

  • 以10000为小节,小节的结尾即使是0,也不使用零。

  • 小节内两个非0数字之间要使用“零”。

  • 当小节的“千”位是0时(即:1~999),只要不是首小节,都要补“零”。

算法设计的一些说明:

  • 对“零”的第三个规则,把检测放在循环的最前面并默认为false,可以自然的丢弃最高小节的加零判断。

  • 单个数字转换用数组实现,var chnNumChar = ["零","一","二","三","四","五","六","七","八","九"];

  • 节权位同样用数组实现,var chnUnitSection = ["","万","亿","万亿","亿亿"];

  • 节内权位同样用数组实现,var chnUnitChar = ["","十","百","千"];

节内转换算法:

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

转换算法主函数:

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的位数。

  • 对每个权位依次转换成位数并求和。

  • 零直接忽略即可。

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

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

如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

张益达 · 2016年10月27日

试着输入10 输出一十

回复

jasminecjc · 2016年12月13日

原来这个问题已经有人发现了,

console.log(NumberToChinese(12));
 一十二

回复

唠唠叨叨 · 2017年03月20日
var result = NumberToChinese(10);
console.log(result);
//结果:一十 
//感觉怪怪的

回复

hippyk · 2018年06月29日

“十” 的结果是 0

回复

ZongLiang · 2018年08月16日

// 怎么才能显示为代码呢。。。
// 。。。
function numberToChinese(num){

var chnNumChar = ['零','一','二','三','四','五','六','七','八','九'];
var chnUnitChar = ['','十','百','千','万','十','百','千','亿','十','百','千'];
var chnStr = '';
var str = num.toString();
while (str.length > 0) {
    var tmpNum = chnNumChar[parseInt(str.substr(0,1))];
    var tmpChar = chnUnitChar[str.length-1];
    chnStr += (chnStr.substr(-1,1) == '零' && tmpNum == '零') ? '' : tmpNum;
    if (tmpNum != '零') {
        chnStr += tmpChar;
    }
    if (chnStr == '一十') {
        chnStr = '十';
    }
    str = str.substr(1);
    if (parseInt(str) === 0) {
        if (str.length >= 8) {
            if (chnStr.substr(-1,1) != '亿') {
                chnStr += '亿';
            }
        } else if (str.length >= 5) {
            if (chnStr.substr(-1,1) != '万') {
                chnStr += '万';
            }
        }
        str = '';
    }
}
return chnStr;

}
///////////

回复

载入中...