問題描述
輸入
十一
輸出
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))