[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创教程] 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. 请按任意键继续. . .
复制代码

回复 2# leo.liu


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

TOP

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

回复 3# cfwyy77_bat


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

TOP

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

TOP

新手
看不懂
没看懂
我是新新手

TOP

返回列表