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 ---- 一兆一千一百一十一亿一千一百二十三万四千五百六十七
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了