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

日常遇到的中文数字主要有两种情况:

1.“二零零一”这种类型,只包含[0-9]对应的十个中文字,需要转换成数字:2001。这种情况的转换十分简单。

2. “三百二十一”这种类型,还有“十百千万亿……”等汉字,需要转换成数字:321,这种情况比较复杂。

思考:

1. “四千三百二十一”,即万以内的数字,转换的思路是:4*1000+3*100+2*10+1

2. “四千三百二十一万”,转换的思路是:(4*1000+3*100+2*10+1)*10000 。

3. 通过递归,依次对字符串兆、亿、万前后切片,并作相应处理。

测试结果:

1. “四万万”,错误转换成了“5,0000”.可以修改程序解决,但是没什么必要,因为日常很少这样使用。

2. “二百五”是“250”,但是程序会转换成205。这个可以修改程序完全解决的。但是还没改。

3.除了上面说的情况,没看到其他什么问题。

复制代码
 1 # 中文数字包含的汉字与其对应的阿拉伯数字构成的字典。字典也可以进一步扩展为支持伍、陆、柒这些汉字
 2 dic = {"":0,"":0,"":1,"":1,"":2,"":2,"":3,"":4,"":5,"":6,"":7,"":8,"":9,"":10,"":100,"":1000,"":10000,"亿":100000000,"":1000000000000}
 3 
 4 def chi_num(text):
 5     if len(text) == 0:
 6         result = 0
 7     # 如果字符串和"十百千万亿兆"没有并集,直接简单转换
 8     elif len(set(text).intersection("十百千万亿兆")) == 0:
 9         result = simply_convert(text)
10     # 以“兆”字为分隔点,将字符串切割成两个字符串组成的列表,注意列表中的字符串可能为空
11     elif "" in text:
12         # 兆、亿、万在字符串一般最多出现一次。特殊情况,比如"四万万",会转换错误
13         text = text.split(sep="",maxsplit=1)
14         # 如果text=['','']需要返回1*dic['兆']
15         result = max(decwise_add(text[0]),1)*dic[""] + chi_num(text[1])
16     elif "亿" in text:
17         text = text.split(sep="亿",maxsplit=1)
18         result = max(decwise_add(text[0]),1)*dic["亿"] + chi_num(text[1])
19     elif "" in text:
20         text = text.split(sep="",maxsplit=1)
21         result = max(decwise_add(text[0]),1)*dic[""] + chi_num(text[1])
22     else:
23         result = decwise_add(text)
24     return result
25         
26 def simply_convert(text):
27     result=""
28     for i in text:
29         result += str(dic[i])
30     return int(result)
31 
32 # 一万以内的数字(比如“一千二百三十四“)通过"1*1000+2*100+3*10+4"这样的方式进行转换
33 def decwise_add(text):
34     #将字符串中的每个汉字转换成对应的阿拉伯数字
35     temp=[dic[i] for i in text]
36     result=0
37     for i in range(len(temp)):
38         if (temp[i]>9) and (i>0):
39             temp[i]*=temp[i-1]
40             temp[i-1] =0
41     for i in temp:
42         result+=i
43     return result
44 
45 if __name__ == '__main__':
46 
47     test_num= ['四万万',
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     import re
75     # 每四位数字添加一个逗号分隔符
76     def formatNum(num):
77         num=str(num)
78         pattern=r'(\d+)(\d{4})((,\d{4})*)'
79         while True:
80             num,count=re.subn(pattern,r'\1,\2\3',num)
81             if count==0:
82                 break
83         return num
84     for i in test_num:
85         print(formatNum(chi_num(i)),"----",i)
复制代码

 

 

输出内容:

复制代码

5,0000 ---- 四万万 
10 ---- 十
100 ---- 百
1000 ---- 千
1,0000 ---- 万
100,0000 ---- 百万
1,0000,0000 ---- 亿
10,0000,0000 ---- 十亿
1,0000,0000,0000 ---- 兆
1000,0000,0000,0000 ---- 千兆
110 ---- 么么零
911 ---- 九么么
1989 ---- 一九八九
2023 ---- 二〇二三
9 ---- 九
11 ---- 十一
123 ---- 一百二十三
1203 ---- 一千二百零三
1,1101 ---- 一万一千一百零一
10,3609 ---- 十万零三千六百零九
123,4567 ---- 一百二十三万四千五百六十七
1123,4567 ---- 一千一百二十三万四千五百六十七
1,1123,4567 ---- 一亿一千一百二十三万四千五百六十七
102,5001,1038 ---- 一百零二亿五千零一万零一千零三十八
1111,1123,4567 ---- 一千一百一十一亿一千一百二十三万四千五百六十七
1,1111,1123,4567 ---- 一兆一千一百一十一亿一千一百二十三万四千五百六十七

复制代码
posted @   沈钩  阅读(1003)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示