zoukankan      html  css  js  c++  java
  • Python 中文(大写)数字转阿拉伯数字(转)

    # constants for chinese_to_arabic
    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,
    }
    
    def chinese_to_arabic(cn:str) -> int:
        unit = 0   # current
        ldig = []  # digest
        for cndig in reversed(cn):
            if cndig in CN_UNIT:
                unit = CN_UNIT.get(cndig)
                if unit == 10000 or unit == 100000000:
                    ldig.append(unit)
                    unit = 1
            else:
                dig = CN_NUM.get(cndig)
                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
    
    
    # TODO: make a full unittest
    def test():
        test_dig = ['',
                    '十一',
                    '一百二十三',
                    '一千二百零三',
                    '一万一千一百零一',
                    '十万零三千六百零九',
                    '一百二十三万四千五百六十七',
                    '一千一百二十三万四千五百六十七',
                    '一亿一千一百二十三万四千五百六十七',
                    '一百零二亿五千零一万零一千零三十八']
        for cn in test_dig:
            x = chinese_to_arabic(cn)
            print(cn, x)
        assert x == 10250011038
    
    if __name__ == '__main__':
        test()

    八 8
    十一 11
    一百二十三 123
    一千二百零三 1203
    一万一千一百零一 11101
    十万零三千六百零九 103609
    一百二十三万四千五百六十七 1234567
    一千一百二十三万四千五百六十七 11234567
    一亿一千一百二十三万四千五百六十七 111234567
    一百零二亿五千零一万零一千零三十八 10250011038


    ---------------------
    作者:HexRain
    来源:CSDN
    原文:https://blog.csdn.net/hexrain/article/details/52790126
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    思科 ASA 系列防火墙 官方文档下载指南
    Batch批量替换hosts
    OPCDA通信--工作在透明模式下的CISCO ASA 5506-X防火墙配置
    OPC DA通讯 KEP6.4 DCOM 配置脚本
    拖放获取文件信息的bat代码
    禁用UpdateOrchestrator重新启动任务
    SIAMATIC S7-1200 中通过 Modbus RTU 如何读取地址范围 9999 到 65535 的输入字
    提问的智慧 (提问前必读)
    [AHK]输入法状态提示,中文状态提示“中”,英文状态提示“EN”[转]
    Wincc V7.3SE安装截图
  • 原文地址:https://www.cnblogs.com/tanrong/p/10434172.html
Copyright © 2011-2022 走看看