要求:把汉语句子【“处罚结果”、“违法依据”、“处罚依据”的】中的汉字(大小写)数字金额转为阿拉伯数字,
如: 罚款2000元,罚款俩千元整,罚款人民币两千元;
步骤: 先识别出文字中的数字(中文/其他格式), 再统一为阿拉伯数字表示(尤其是罚款,便于后续的金额比较);
# 注意:不能识别“百分之”
#把汉语句子中的汉字(大小写)数字转为阿拉伯数字,不能识别“百分之”
common_used_numerals_tmp = {'零': 0, '一': 1, '二': 2, '两': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9, '十': 10,
u'〇': 0, u'壹': 1, u'贰': 2, u'叁': 3, u'肆': 4, u'伍': 5, u'陆': 6, u'柒': 7, u'捌': 8, u'玖': 9,'拾': 10,
'百': 100, '千': 1000,u'貮': 2, u'俩': 2, '佰': 100, '仟': 1000, '萬': 10000, '万': 10000, '亿': 100000000,
'億': 100000000, '兆': 1000000000000 }
common_used_numerals = {}
for key in common_used_numerals_tmp:
common_used_numerals[key] = common_used_numerals_tmp[key]
def chinese2digits(uchars_chinese):
total = 0
r = 1 # 表示单位:个十百千...
for i in range(len(uchars_chinese) - 1, -1, -1):
val = common_used_numerals.get(uchars_chinese[i])
if val >= 10 and i == 0: # 应对 十三 十四 十*之类
if val > r:
r = val
total = total + val
else:
r = r * val
# total =total + r * x
elif val >= 10:
if val > r:
r = val
else:
r = r * val
else:
total = total + r * val
return total
num_str_start_symbol = ['一', '二', '两', '三', '四', '五', '六', '七', '八', '九', '十',
'壹' ,'贰', '叁', '肆', '伍' ,'陆','柒' , '捌' ,'玖','拾', '貮', '俩', ]
more_num_str_symbol = ['零', '一', '二', '两', '三', '四', '五', '六', '七', '八', '九', '十', '百', '千', '万', '亿',
'〇', '壹' ,'贰', '叁', '肆', '伍' ,'陆','柒' , '捌' ,'玖','拾', '貮', '俩', '佰', '仟', '萬', '億', '兆']
def ChineseNumToArab(oriStr):
lenStr = len(oriStr);
aProStr = ''
if lenStr == 0:
return aProStr;
hasNumStart = False;
numberStr = ''
for idx in range(lenStr):
if oriStr[idx] in num_str_start_symbol:
if not hasNumStart:
hasNumStart = True;
numberStr += oriStr[idx]
else:
if hasNumStart:
if oriStr[idx] in more_num_str_symbol:
numberStr += oriStr[idx]
continue
else:
numResult = str(chinese2digits(numberStr))
numberStr = ''
hasNumStart = False;
aProStr += numResult
aProStr += oriStr[idx]
pass
if len(numberStr) > 0:
resultNum = chinese2digits(numberStr)
aProStr += str(resultNum)
return aProStr
if __name__ == '__main__':
testStr = ['罚款2000元','罚款两千元','罚款俩千元整','罚款人民币两千元',
'《中华人民共和国水污染防治法》第八十三条第(二)项,并处十万元以上一百万元以下的罚款',
'十一','一百二十三','两百三十二','一千二百零三','一万一千一百零一',u'十万零三千六百零九',u'一百二十三万四千五百六十七',
u'一千一百二十三万四千五百六十七', u'一亿一千一百二十三万四千五百六十七', u'一百零二亿五千零一万零一千零三十八',
u'一千一百一十一亿一千一百二十三万四千五百六十七', u'一兆一千一百一十一亿一千一百二十三万四千五百六十七',
'我有百三十二块钱', '十二个套餐', '一亿零八万零三百二十三', '今天天气真不错',
'百分之八十 discount rate很高了', '千万不要','我们俩个人', '这个invoice value值一百万',
'我的一百件商品have quality','找一找我的收藏夹里,有没有一个眼镜' ]
for tstr in testStr:
print(tstr + ' = ' + ChineseNumToArab(tstr))