Python实现中文大写金额转阿拉伯数字

一只小鹿
一只小鹿
发布时间:2026-10-11 | 1人浏览过
原创

本文详解如何用Python将财务票据中的中文大写金额自动转换为阿拉伯数字。通过正则表达式提取元角分、按亿万千百逐级分割与映射计算,结合完整代码示例与测试验证,提供一套高可用的转换方案,适用于票据核对与自动化记账场景。

转换目标与运行准备

在财务与会计场景中,为防篡改常使用中文大写金额。为进行自动化核算或系统录入,需将其转为标准阿拉伯数字格式(保留两位小数)。本方案以Python为核心工具,拆解为文本正则切割 → 单位层级拆分 → 数值映射累加三步,最终输出精确到角的浮点结果。基础运行环境为Python 3.6及以上版本,无需安装第三方扩展,仅依赖标准库re进行字符串匹配。

真实操作顺序

第1步:建立字符映射字典

目的:构建中文字符到数值的静态对照关系,避免重复查表开销。
入口:模块全局命名空间。
动作:初始化两个字典,分别保存“零~玖”的基数值与“拾、佰、仟”的单位倍率。确保键名与票据常用字完全一致。

第2步:亿/万级大单位切割

目的:将超长金额按位权拆解为独立的可计算区块,避免字符串越界或权重错位。
入口:待转换的完整金额字符串。
动作:优先级检测“亿”,定位索引后切片前半段标记为亿级,后半段作为新输入继续扫描“万”。若某一级单位缺失,则以空字符串占位保持字典结构对齐。完成切割后返回结构化对象,例如将“贰亿叁仟万肆仟伍佰”拆分为 {"亿": "贰", "万": "叁仟", "一": "肆仟伍佰"}。

第3步:单区块数值解析

目的:将切分出的中文子串还原为整数数值,处理连续单位与前置省略问题。
入口:各层级切割后的子串。
动作:逐字遍历,命中基数则乘以当前单位加入临时缓存。命中“拾、佰、仟”时更新乘数因子,并将缓存值推入总结果,随后重置缓存与单位。针对“拾”前无数字的典型写法(如“壹拾万”),逻辑会自动补全首位为1,防止解析中断。

第4步:元角分拼接与格式化输出

目的:整合主整数与小数部分,符合财务打印与数据库存储规范。
入口:原始字符串及已计算的整数总额。
动作:使用正则表达式同时捕获“元、角、分”三段内容。对角、分字段剥离末尾单位字后查表相乘(0.1 / 0.01)。汇总亿、万、个三级整数字段与角分小数,统一格式化为两位定长字符串返回。若正则未匹配成功,则安全拦截并返回 无法转换 占位符。

完整实现代码

import re

# 定义中文数字到阿拉伯数字的映射
chinese_to_arabic = {
    '零': 0, '壹': 1, '贰': 2, '叁': 3, '肆': 4,
    '伍': 5, '陆': 6, '柒': 7, '捌': 8, '玖': 9,
}

unit_map = {'拾': 10, '佰': 100, '仟': 1000}


def chinese_to_number(chinese_str):
    result = 0
    temp_val = 0
    unit = 1
    for char in chinese_str:
        if char in chinese_to_arabic:
            temp_val += chinese_to_arabic[char] * unit
            if unit < 10:
                unit = 1
        elif char in unit_map:
            unit = unit_map[char]
            temp_val = 1 if temp_val == 0 else temp_val
            result += temp_val * unit
            temp_val = 0
            unit = 1
        elif char in ['元', '角', '分']:
            break
    result += temp_val
    return result


def extract_parts_yi_wan(s):
    result = {"亿": "", "万": "", "一": ""}
    if "亿" in s:
        yi_index = s.index("亿")
        result["亿"] = s[:yi_index]
        after_yi = s[yi_index + 1:]
        if "万" in after_yi:
            wan_index = after_yi.index("万")
            result["万"] = after_yi[:wan_index]
            result["一"] = after_yi[wan_index + 1:]
        else:
            result["万"] = ""
            result["一"] = after_yi
    else:
        if "万" in s:
            wan_index = s.index("万")
            result["万"] = s[:wan_index]
            result["一"] = s[wan_index + 1:]
        else:
            result["一"] = s
    return result


def convert_amounts(amount_list):
    pattern = re.compile(
        r'([壹贰叁肆伍陆柒捌玖零拾佰仟万亿]+)元?' 
        r'((?:零|[壹贰叁肆伍陆柒捌玖]+)角)?'
        r'((?:零|[壹贰叁肆伍陆柒捌玖]+)分)?')

    converted_list = []
    for amount in amount_list:
        total = 0
        match = pattern.findall(amount)
        if match:
            yuan, jiao, fen = match[0]
            ret_yuan = extract_parts_yi_wan(yuan)
            for k, v in ret_yuan.items():
                new_number = 0
                if v:
                    new_number = chinese_to_number(v)
                    if k == "亿":
                        new_number *= 100000000
                    elif k == "万":
                        new_number *= 10000
                total += new_number

            if jiao and jiao != '零角':
                total += chinese_to_arabic[jiao.replace('角', '')] * 0.1
            if fen and fen != '零分':
                total += chinese_to_arabic[fen.replace('分', '')] * 0.01

            converted_list.append(f"{total:.2f}")
        else:
            converted_list.append("无法转换")
    return converted_list

amounts = ['贰拾捌万壹仟柒佰伍拾伍元壹角玖分', '贰拾伍万捌仟肆佰玖拾壹元']
print(convert_amounts(amounts))

测试结果与边界说明

将典型票据字符串传入函数后,控制台可稳定返回目标列表。该脚本适用于常规业务单据解析,但在处理极长位数(超万亿)或特殊金融变体时需额外补充校验规则。以下为实际运行输出对照:

['281755.19', '258491.00']

简要总结

通过上述步骤即可完成从原始中文大写票据到标准化数字的转换流程。核心在于利用正则精准定位层级,配合权重映射消除人工核对误差。以上就是Python实现中文大写金额转阿拉伯数字的详细内容,更多关于Python财务数据处理的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表