美文网首页IT@程序员猿媛
Python中文数转阿拉伯数

Python中文数转阿拉伯数

作者: Cloudox_ | 来源:发表于2019-04-15 11:51 被阅读3次

    提供一个可用的中文数字转阿拉伯数字的函数,效果是把类似“五十六”、“柒”、“十八”这些中文数字转成“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 ,解决了编码的问题并加以解释。

    相关文章

      网友评论

        本文标题:Python中文数转阿拉伯数

        本文链接:https://www.haomeiwen.com/subject/dzxuwqtx.html