阿拉伯數字轉中文數字
中文數字的特點:
- 每個計數數字都跟着一個權位,權位有:十、百、千、萬、億。
- 以“萬”爲小節,對應一個節權位,萬以下沒有節權位。
- 每個小節內部以“十百千”爲權位獨立計數。
- “十百千”不能連續出現,而“萬”和“億”作爲節權位時可以和其他權位連用,如:“二十億”。
中文數字對“零”的使用要滿足以下三條規則:
- 以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; } |