中文数字转换成阿拉伯数字

题目: 中文数字转换成阿拉伯数字

解题思路: 以亿为分界点,将亿之前的数字作为一部分,其余的部分再做处理。

参考链接

代码:

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
chs_arabic_map = {'零': 0, '一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9,
'十': 10, '百': 100, '千': 1000, '万': 10000, '亿': 10 ** 8,
}

def convertChineseDigitsToArabic(chinese_digits, encoding="utf-8"):
res = 0
tmp = 0
res_before_yi = 0
for char in chinese_digits:
val = chs_arabic_map.get(char, None)
if val == 10**8:
res += tmp
res *= val
res_before_yi = res_before_yi * 10 ** 8 + res
res = 0
tmp = 0
elif val == 10000:
res += tmp
res *= val
tmp = 0
elif val >=10:
if tmp == 0:
tmp = 1
res = res + tmp*val
tmp = 0
elif val is not None:
tmp = tmp * 10 + val
else:
print("不合法的字符")
res += res_before_yi
res += tmp
return res


test_map = {
# '三千五百二十三': 3523,
'九万五千零七十五亿八百零七万九千二百零八': 9507508079208,
'四万三千五百二十一': 43521,
'三千五百二十一': 3521,
'三千五百零八': 3508,
'三五六零': 3560,
'一万零三十': 10030,
'': 0,
# 1 digit 个
'零': 0,
'一': 1,
'二': 2,
'三': 3,
'四': 4,
'五': 5,
'六': 6,
'七': 7,
'八': 8,
'九': 9,
# 2 digits 十
'十': 10,
'十一': 11,
'二十': 20,
'二十一': 21,
# 3 digits 百
'一百': 100,
'一百零一': 101,
'一百一十': 110,
'一百二十三': 123,
# 4 digits 千
'一千': 1000,
'一千零一': 1001,
'一千零一十': 1010,
'一千一百': 1100,
'一千零二十三': 1023,
'一千二百零三': 1203,
'一千二百三十': 1230,
# 5 digits 万
'一万': 10000,
'一万零一': 10001,
'一万零一十': 10010,
'一万零一百': 10100,
'一万一千': 11000,
'一万零一十一': 10011,
'一万零一百零一': 10101,
'一万一千零一': 11001,
'一万零一百一十': 10110,
'一万一千零一十': 11010,
'一万一千一百': 11100,
'一万一千一百一十': 11110,
'一万一千一百零一': 11101,
'一万一千零一十一': 11011,
'一万零一百一十一': 10111,
'一万一千一百一十一': 11111,
# 6 digits 十万
'十万零二千三百四十五': 102345,
'十二万三千四百五十六': 123456,
'十万零三百五十六': 100356,
'十万零三千六百零九': 103609,
# 7 digits 百万
'一百二十三万四千五百六十七': 1234567,
'一百零一万零一百零一': 1010101,
'一百万零一': 1000001,
# 8 digits 千万
'一千一百二十三万四千五百六十七': 11234567,
'一千零一十一万零一百零一': 10110101,
'一千万零一': 10000001,
# 9 digits 亿
'一亿一千一百二十三万四千五百六十七': 111234567,
'一亿零一百零一万零一百零一': 101010101,
'一亿零一': 100000001,
# 10 digits 十亿
'十一亿一千一百二十三万四千五百六十七': 1111234567,
# 11 digits 百亿
'一百一十一亿一千一百二十三万四千五百六十七': 11111234567,
# 12 digits 千亿
'一千一百一十一亿一千一百二十三万四千五百六十七': 111111234567,
# 13 digits 万亿
'一万一千一百一十一亿一千一百二十三万四千五百六十七': 1111111234567,
# 14 digits 十万亿
'十一万一千一百一十一亿一千一百二十三万四千五百六十七': 11111111234567,
# 17 digits 亿亿
'一亿一千一百一十一万一千一百一十一亿一千一百二十三万四千五百六十七': 11111111111234567,
}


for each in test_map:
try:
assert (test_map[each] == convertChineseDigitsToArabic(each))
except:
print(each, test_map[each], convertChineseDigitsToArabic(each))