Fork me on GitHub

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
版权声明:本文为博主原创文章,转载请附上博文链接!

 

posted @ 2019-02-25 22:01  RongT  阅读(3631)  评论(0编辑  收藏  举报