阿拉伯數字與中文數字的轉換(javascript實現)

此爲《算法的樂趣》讀書筆記,我用javascript從新實現算法。javascript

阿拉伯數字轉中文數字

中文數字的特色:java

  • 每一個計數數字都跟着一個權位,權位有:10、百、千、萬、億。算法

  • 以「萬」爲小節,對應一個節權位,萬如下沒有節權位。數組

  • 每一個小節內部以「十百千」爲權位獨立計數。函數

  • 「十百千」不能連續出現,而「萬」和「億」做爲節權位時能夠和其餘權位連用,如:「二十億」。設計

中文數字對「零」的使用要知足如下三條規則:code

  • 以10000爲小節,小節的結尾即便是0,也不使用零。對象

  • 小節內兩個非0數字之間要使用「零」。ip

  • 當小節的「千」位是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;
}
相關文章
相關標籤/搜索