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