Board logo

标题: [原创教程] Python实现中文数字替换成阿拉伯数字 [打印本页]

作者: Gin_Q    时间: 2020-7-18 21:31     标题: Python实现中文数字替换成阿拉伯数字

本帖最后由 Gin_Q 于 2020-7-20 10:47 编辑

大家有兴趣可以测测!
  1. #coding=utf-8
  2. #By Gin
  3. #2020/7/17
  4. #Rev 02
  5. ch_dict = {u'零':0, u'一':1, u'二':2, u'三':3, u'四':4,
  6.         u'五':5, u'六':6, u'七':7, u'八':8, u'九':9,u'十':10,
  7.         u'百':100, u'千':10 ** 3, u'万':10 ** 4,u'〇':0,
  8.         u'壹':1, u'贰':2, u'叁':3, u'肆':4,u'伍':5,
  9.         u'陆':6, u'柒':7, u'捌':8, u'玖':9,u'拾':10,
  10.         u'佰':100, u'仟':10 ** 3, u'萬':10 ** 4,u'亿':10 ** 8, u'億':10 ** 8,
  11.         u'幺': 1,u'两':2}
  12. def converion(temp, unit):
  13.     intr = 0
  14.     # print(temp, unit)
  15.     temp_len = len(temp)
  16.     if temp_len <= 2 and temp[0] == 10: #十到十九需要单独转换
  17.         for i in temp:
  18.             intr += i
  19.         return intr * unit
  20.     for i in range(temp_len):
  21.         if temp[i] > 9 and temp[i-1] != 0:
  22.             intr += temp[i] * temp[i-1]
  23.     if temp[-1] < 10: intr += temp[-1]
  24.     return intr * unit
  25. def split_unit(temp, unit):
  26.     nu = []
  27.     while True:
  28.         if temp[0] != unit:
  29.             nu.append(temp.pop(0))
  30.             continue
  31.         temp.pop(0)
  32.         return converion(nu, unit)
  33. def onere(strarr):
  34.     intr = 0
  35.     temp = [ch_dict[i] for i in strarr] #列表666[6, 100, 6, 10, 6]
  36.     if 10**8 in temp:
  37.         intr += split_unit(temp, 10**8)
  38.     if 10**4 in temp:
  39.         intr += split_unit(temp, 10**4)
  40.     if temp:
  41.         intr += converion(temp, 1)
  42.     return str(intr)
  43. test_dig = [u'九',
  44.                 u'十一',
  45.                 u'一百二十三',
  46.                 u'一千二百零三',
  47.                 u'一万一千一百零一',
  48.                 u'十万零三千六百零九',
  49.                 u'一百二十三万四千五百六十七',
  50.                 u'一千一百二十三万四千五百六十七',
  51.                 u'一亿一千一百二十三万四千五百六十七',
  52.                 u'一百零二亿五千零一万零一千零三十八',
  53.                 u'一千一百一十一亿一千一百二十三万四千五百六十七',
  54.                 ]
  55.                
  56. for i in test_dig:
  57.     print(i,'\n',onere(i))
复制代码
  1. 9
  2. 十一
  3. 11
  4. 一百二十三
  5. 123
  6. 一千二百零三
  7. 1203
  8. 一万一千一百零一
  9. 11101
  10. 十万零三千六百零九
  11. 103609
  12. 一百二十三万四千五百六十七
  13. 1234567
  14. 一千一百二十三万四千五百六十七
  15. 11234567
  16. 一亿一千一百二十三万四千五百六十七
  17. 111234567
  18. 一百零二亿五千零一万零一千零三十八
  19. 10250011038
  20. 一千一百一十一亿一千一百二十三万四千五百六十七
  21. 111111234567
  22. 请按任意键继续. . .
复制代码

作者: leo.liu    时间: 2020-7-19 14:52

新手
看不懂
没看懂
我是新新手
作者: cfwyy77_bat    时间: 2020-7-20 09:20

如果是全角数字"8080"  这种就不要用字典映射转换了。   可以直接int()转。
另外
python3中的字符串都是unicode字符串,前缀可以不加u了吧。
47行,参数直接传temp就可以,没必要传一个副本吧。
作者: Gin_Q    时间: 2020-7-20 10:42

本帖最后由 Gin_Q 于 2020-7-20 10:45 编辑

回复 3# cfwyy77_bat


    字典是从网上代码复制的,核心代码自己写的!
    8080那个我删除了,忘了修改字典了,的确直接拼接就好了!
    47行的确直接传进去就好了,因为前面的元素已经被弹出了!
    谢谢指正!很赞哦!
作者: Gin_Q    时间: 2020-7-20 16:36

回复 2# leo.liu


    多看视频,多看书!找个论坛多问问(或者百度),基础重要!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2