找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 15800|回复: 4

[原创教程] Python实现中文数字替换成阿拉伯数字

[复制链接]
发表于 2020-7-18 21:31:51 | 显示全部楼层 |阅读模式
本帖最后由 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. 请按任意键继续. . .
复制代码
发表于 2020-7-19 14:52:55 | 显示全部楼层
新手
看不懂
没看懂
我是新新手
发表于 2020-7-20 09:20:18 | 显示全部楼层
如果是全角数字"8080"  这种就不要用字典映射转换了。   可以直接int()转。
另外
python3中的字符串都是unicode字符串,前缀可以不加u了吧。
47行,参数直接传temp就可以,没必要传一个副本吧。
 楼主| 发表于 2020-7-20 10:42:59 | 显示全部楼层
本帖最后由 Gin_Q 于 2020-7-20 10:45 编辑

回复 3# cfwyy77_bat


    字典是从网上代码复制的,核心代码自己写的!
    8080那个我删除了,忘了修改字典了,的确直接拼接就好了!
    47行的确直接传进去就好了,因为前面的元素已经被弹出了!
    谢谢指正!很赞哦!
 楼主| 发表于 2020-7-20 16:36:17 | 显示全部楼层
回复 2# leo.liu


    多看视频,多看书!找个论坛多问问(或者百度),基础重要!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 03:52 , Processed in 0.016770 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表