Python漢字轉數字

問題描述

輸入

十一

輸出

11

輸入

九萬八千零七十六點五四三二一

輸出

98076.54321




代碼

對參考文獻1中的代碼進行優化,添加了小數的情況

from decimal import *


def chinese2digit(cn):
    '''中文轉數字

    :param cn: 中文字符串
    :return: 數字
    >>> chinese2digit('十一')
    11
    >>> chinese2digit('九萬八千零七十六點五四三二一')
    Decimal('98076.54321')
    '''
    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
    }

    cn = cn.split('點')
    integer = list(cn[0])  # 整數部分
    decimal = list(cn[1]) if len(cn) == 2 else []  # 小數部分
    unit = 0  # 當前單位
    parse = []  # 解析數組
    while integer:
        x = integer.pop()
        if x in CN_UNIT:
            # 當前字符是單位
            unit = CN_UNIT.get(x)
            if unit == 10000:
                parse.append('w')  # 萬位
                unit = 1
            elif unit == 100000000:
                parse.append('y')  # 億位
                unit = 1
            elif unit == 1000000000000:  # 兆位
                parse.append('z')
                unit = 1
            continue
        else:
            # 當前字符是數字
            dig = CN_NUM.get(x)
            if unit:
                dig = dig * unit
                unit = 0
            parse.append(dig)

    if unit == 10:  # 處理10-19的數字
        parse.append(10)

    result = 0
    tmp = 0
    while parse:
        x = parse.pop()
        if x == 'w':
            tmp *= 10000
            result += tmp
            tmp = 0
        elif x == 'y':
            tmp *= 100000000
            result += tmp
            tmp = 0
        elif x == 'z':
            tmp *= 1000000000000
            result += tmp
            tmp = 0
        else:
            tmp += x
    result += tmp

    if decimal:
        unit = 0.1
        getcontext().prec = len(decimal)  # 小數精度
        result = Decimal(float(result))
        tmp = Decimal(0)
        for x in decimal:
            dig = CN_NUM.get(x)
            tmp += Decimal(str(dig)) * Decimal(str(unit))
            unit *= 0.1
        getcontext().prec = len(result.to_eng_string()) + len(decimal)  # 完整精度
        result += tmp
    return result


if __name__ == '__main__':
    test = [
        '九',  # 9
        '十一',  # 11
        '一百二十三',  # 123
        '一千二百零三',  # 1203
        '一萬一千一百零一',  # 11101
        '十萬零三千六百零九',  # 103609
        '一百二十三萬四千五百六十七',  # 1234567
        '一千一百二十三萬四千五百六十七',  # 11234567
        '一億一千一百二十三萬四千五百六十七',  # 111234567
        '一百零二億五千零一萬零一千零三十八',  # 10250011038
        '一千一百一十一億一千一百二十三萬四千五百六十七',  # 111111234567
        '一兆一千一百一十一億一千一百二十三萬四千五百六十七',  # 1111111234567
        '九萬八千零七十六點五四三二一零七四五六',  # 98076.54321
        '九萬八千零七十六點五四三二一',  # 98076.54321
    ]

    for i in test:
        print(chinese2digit(i))




參考文獻

  1. Python將漢字數字轉換成阿拉伯數字的方法
  2. Python開發——利用正則表達式實現計算器算法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章