python3 将中文句子中汉字数字金额(大小写)转阿拉伯数字

 要求:把汉语句子【“处罚结果”、“违法依据”、“处罚依据”的】中的汉字(大小写)数字金额转为阿拉伯数字,

如:   罚款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))

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值