阿拉伯数字与中文数字转换算法

  • 《算法的乐趣》- 王晓华
  • 读书笔记,原文用C语言实现算法
  • 现在改用JavaScript实现算法

阿拉伯数字转换中文表示

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// 单个数字转换:数组下标定义中文数字表
var chnNumChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
// 节与权位识别。节:以万为单位截断。一维表
// 32位正数能表达的最大数,节权是万亿已经够了。最低的节没有节权,使用空字符串做占位符(算法设计的一致性处理技巧)
var chnUnitSection = ['', '万', '亿', '万亿'];
// 每个节内数字的权位
// 通过移位可以确定每个数字对应的权位;以移位次数做下标,查节权表即可
var chnUnitChar = ['', '十', '百', '千'];
// 算法设计:先对阿拉伯数字分节,确定节权位名称
// var chnStr = 1000;
function NumberToChinese(num) {
// 输出字符串
var chnStr = '';
// 记录节的位置:0代表“”,1代表万,2代表亿
var unitPos = 0;
// 中转状态
var strIns = '';
// 是否需要补0
var needZero = false;
// 移位循环 每节取余10000
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;
// 千位是0,需要下一个section补0
needZero = (section < 1000) && (section > 0);
num = parseInt(num / 10000);
unitPos++;
}
return chnStr;
}
// 将一个节的数字转换成中文数字
function SectionToChinese (section) {
var chnStr = '';
var strIns = '';
var unitPos = 0;
// 确保连续多个,只补一个中文0
var zero = true;
while (section > 0) {
var v = section % 10;
if (v === 0) {
if ((section === 0) || !zero) {
zero = true;
chnStr = chnNumChar[v] + chnStr;
}
} else {
// 至少有一个数字不是
zero = false;
// 此位对应的中文数字
strIns = chnNumChar[v];
// 此位对应的中文权位
strIns += chnUnitChar[unitPos];
chnStr = strIns + chnStr;
}
// 移位
unitPos++;
section = parseInt(section / 10);
}
return chnStr;
}
var body = document.querySelector('body');
var num = 10010441;
var text = document.createTextNode(num + ' => '+ NumberToChinese(num));
// 输出 “10010441 => 一千零一万零四百四十一”
body.appendChild(text);