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

发布时间 2023-06-22 17:08:04作者: 沈钩

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

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 # 中文数字包含的汉字与其对应的阿拉伯数字构成的字典。字典也可以进一步扩展为支持伍、陆、柒这些汉字
 2 dic = {"0":0,"":0,"":1,"":2,"":3,"":4,"":5,"":6,"":7,"":8,"":9,"":10,"":100,"":1000,"":10000,"亿":100000000,"":1000000000000}
 3 def chi_num(text):
 4     # 如果字符串和"十百千万亿兆"没有并集,直接简单转换
 5     if len(set(text).intersection("十百千万亿兆")) == 0:
 6         result = simply_convert(text)
 7     # 以“兆”字为分隔点,将字符串切割成两个字符串分别处理
 8     elif "" in text:
 9         result = chi_num(text[text.index("")+1:]) + decwise_add(text[:text.index("")])*dic[""]
10     elif "亿" in text:
11         result = chi_num(text[text.index("亿")+1:]) + decwise_add(text[:text.index("亿")])*dic["亿"]
12     elif "" in text:
13         result = chi_num(text[text.index("")+1:]) + decwise_add(text[:text.index("")])*dic[""]
14     else:
15         result = decwise_add(text)
16     return result
17         
18 def simply_convert(text):
19     result=""
20     for i in text:
21         result += str(dic[i])
22     return int(result)
23 
24 # 一万以内的数字(比如“一千二百三十四“)通过"1*1000+2*100+3*10+4"这样的方式进行转换
25 def decwise_add(text):
26     #将字符串中的每个汉字转换成对应的阿拉伯数字
27     temp=[dic[i] for i in text]
28     result=0
29     for i in range(len(temp)):
30         if (temp[i]>9) and (i>0):
31             temp[i]*=temp[i-1]
32             temp[i-1] =0
33     for i in temp:
34         result+=i
35     return result
36 
37 import re
38 def formatNum(num):      
39     num=str(num)
40     pattern=r'(\d+)(\d{4})((,\d{4})*)'
41     while True:
42         num,count=re.subn(pattern,r'\1,\2\3',num)
43         if count==0:
44             break
45     return num
46 
47 if __name__ == '__main__':
48 
49     test_num= [u'',
50                 u'十一',
51                 u'一百二十三',
52                 u'一千二百零三',
53                 u'一万一千一百零一',
54                 u'十万零三千六百零九',
55                 u'一百二十三万四千五百六十七',
56                 u'一千一百二十三万四千五百六十七',
57                 u'一亿一千一百二十三万四千五百六十七',
58                 u'一百零二亿五千零一万零一千零三十八',
59                 u'一千一百一十一亿一千一百二十三万四千五百六十七',
60                 u'一兆一千一百一十一亿一千一百二十三万四千五百六十七',
61                 ]
62 
63     for i in test_num:
64         print(i,"    -->  ",formatNum(chi_num(i)))

 

输出内容:

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 ---- 一兆一千一百一十一亿一千一百二十三万四千五百六十七