IT@程序员猿媛

Python中文数转阿拉伯数

2019-04-15  本文已影响3人  Cloudox_

提供一个可用的中文数字转阿拉伯数字的函数,效果是把类似“五十六”、“柒”、“十八”这些中文数字转成“56”、“7”、“18”这种阿拉伯数字返回。

# -*- coding: utf-8 -*-

def chinese_to_arabic(cn_num):
    CN_NUM = {
        '〇' : 0, '一' : 1, '二' : 2, '三' : 3, '四' : 4, '五' : 5, '六' : 6, '七' : 7, '八' : 8, '九' : 9, '零' : 0,
        '壹' : 1, '贰' : 2, '叁' : 3, '肆' : 4, '伍' : 5, '陆' : 6, '柒' : 7, '捌' : 8, '玖' : 9, '貮' : 2, '两' : 2,
    }
    CN_UNIT = {
        '十' : 10,
        '拾' : 10,
        '百' : 100,
        '佰' : 100,
        '千' : 1000,
        '仟' : 1000,
        '万' : 10000,
        '萬' : 10000,
        '亿' : 100000000,
        '億' : 100000000,
        '兆' : 1000000000000,
    }
    unit = 0   # 初始单位为个位数0
    ldig = []  # 数字
    print(cn_num)
    for cn_dig in reversed(cn_num.decode('utf-8')): # 翻转字符串,从个位数开始处理
        print(cn_dig)
        if CN_UNIT.get(cn_dig.encode('utf-8')) != None:
            unit = CN_UNIT.get(cn_dig.encode('utf-8'))
            print("该字为单位:"+str(unit))
            if unit == 10000 or unit == 100000000: # 处理千万、百亿之类的单位重叠数字
                ldig.append(unit)
                unit = 1
        else:
            dig = CN_NUM.get(cn_dig.encode('utf-8'))
            print("该字为数字:"+str(dig))
            if unit: # 之前有遇到单位,则乘以单位
                dig *= unit
                unit = 0
            ldig.append(dig)
    if unit == 10: # 处理十开头的数字
        ldig.append(10)
    # 开始加总
    val, tmp = 0, 0
    for x in reversed(ldig): #恢复正序
        if x == 10000 or x == 100000000:
            val += tmp * x
            tmp = 0
        else:
            tmp += x
    val += tmp
    return val

print(chinese_to_arabic("五十六")) --> 56
print(chinese_to_arabic("柒")) --> 7
print(chinese_to_arabic("十一")) --> 11
print(chinese_to_arabic("一百零八")) --> 108
print(chinese_to_arabic("两亿三千万")) --> 230000000

思路是先将中文反序,注意要用utf8解码,否则反序后得到的是乱码。反序的目的是从个位数开始依次往高位记录单位和数字,方便对数字做单位的乘积。

然后依次判断每个字是单位还是数字,这里也要注意用utf8编码后再做get寻找,否则会找不到,因为是中文。

有一些特殊的数字是需要特别处理的,比如十八,就是十开头的,前面没有数字了,默认为1。比如几百万、几千亿,这种事单位重叠在一起的,也需要特别处理乘积。

全部处理完后,再把记录的数字反过来一次恢复正序,做加总得到结果。


查看作者首页

参考自:https://blog.csdn.net/hexrain/article/details/52790126 ,解决了编码的问题并加以解释。

上一篇下一篇

猜你喜欢

热点阅读