Python实现将中文大写金额转数字金额

 更新时间:2025年09月23日 08:39:58   作者:幸福清风  
在日常的财务处理、票据识别或金融系统开发中,我们常常需要将中文大写的金额转换为阿拉伯数字形式,下面我们就来看看如何使用Python实现这一需求吧

在日常的财务处理、票据识别或金融系统开发中,我们常常需要将中文大写的金额转换为阿拉伯数字形式。例如:

  • “壹佰元整” → “100”
  • “壹仟贰佰叁拾肆元伍角陆分” → “1234.56”
  • “壹拾陆万元” → “160000”

这类需求在银行票据OCR识别、合同金额处理等场景中非常常见。本文将详细介绍如何使用 Python 编写一个能够准确识别并转换中文大写金额的函数,并通过对比验证其准确性。

一、中文大写金额规则简介

中文大写金额由以下部分组成:

数字部分(0~9):

零 壹 贰 叁 肆 伍 陆 柒 捌 玖

单位部分:

拾 佰 仟 万 亿

小数单位:

角 分

特殊标记:

  • “元”:整数部分结束标志
  • “整”:表示无角分
  • “零”:表示中间有空位

二、Python 实现思路解析

1. 映射关系定义

我们首先定义两个字典,分别用于映射中文数字和单位到对应的数值:

num_map = {
    '零': 0, '壹': 1, '贰': 2, '叁': 3, '肆': 4,
    '伍': 5, '陆': 6, '柒': 7, '捌': 8, '玖': 9
}

unit_map = {
    '拾': 10, '佰': 100, '仟': 1000,
    '万': 10000, '亿': 100000000
}

2. 预处理输入字符串

去除多余的空格与“整”字,便于后续解析:

capital = capital.replace(' ', '').replace('整', '')

3. 分离整数与小数部分

根据“元”分割出整数部分与角分部分:

if '元' in capital:
    parts = capital.split('元')
    yuan_part = parts[0]
    jiao_fen_part = parts[1] if len(parts) > 1 else ''
else:
    yuan_part = capital

4. 解析整数部分

核心逻辑是逐字符遍历,遇到数字则记录临时值,遇到单位则进行乘法运算:

def parse_section(s):
    if not s:
        return 0
    if s == '拾':  # 特殊情况:"拾"表示10
        return 10

    result = 0
    temp = 0
    for char in s:
        if char in num_map:
            temp = num_map[char]
        elif char in unit_map:
            result += temp * unit_map[char]
            temp = 0
    result += temp
    return result

5. 处理“亿”和“万”的层级结构

递归处理“亿”和“万”的分层结构:

def parse_amount(s):
    if '亿' in s:
        parts = s.split('亿')
        yi_part = parts[0]
        rest_part = parts[1] if len(parts) > 1 else ''
        value = parse_section(yi_part) * 100000000
        if rest_part:
            value += parse_amount(rest_part)
        return value
    elif '万' in s:
        parts = s.split('万')
        wan_part = parts[0]
        rest_part = parts[1] if len(parts) > 1 else ''
        value = parse_section(wan_part) * 10000
        if rest_part:
            value += parse_section(rest_part)
        return value
    else:
        return parse_section(s)

6. 角分处理

处理角分部分,支持“角”、“分”、“角分”三种组合:

def parse_jiao_fen(jf):
    if not jf:
        return ""

    jiao = 0
    fen = 0

    if '角' in jf and '分' in jf:
        parts = jf.split('角')
        if parts[0] in num_map:
            jiao = num_map[parts[0]]
        fen_part = parts[1].replace('分', '')
        if fen_part in num_map:
            fen = num_map[fen_part]
    elif '角' in jf:
        jiao_part = jf.replace('角', '')
        if jiao_part in num_map:
            jiao = num_map[jiao_part]
    elif '分' in jf:
        fen_part = jf.replace('分', '')
        if fen_part in num_map:
            fen = num_map[fen_part]

    if jiao > 0 and fen > 0:
        return f".{jiao}{fen}"
    elif jiao > 0:
        return f".{jiao}0"
    elif fen > 0:
        return f".0{fen}"
    else:
        return ""

三、完整代码示例

def convert_capital_to_small(capital):
    num_map = {
        '零': 0, '壹': 1, '贰': 2, '叁': 3, '肆': 4,
        '伍': 5, '陆': 6, '柒': 7, '捌': 8, '玖': 9
    }

    unit_map = {
        '拾': 10, '佰': 100, '仟': 1000,
        '万': 10000, '亿': 100000000
    }

    capital = capital.replace(' ', '').replace('整', '')

    if not capital or capital == '零元':
        return '0'

    yuan_part = capital
    jiao_fen_part = ''

    if '元' in capital:
        parts = capital.split('元')
        yuan_part = parts[0]
        if len(parts) > 1:
            jiao_fen_part = parts[1]
    else:
        yuan_part = capital.replace('整', '')

    def parse_section(s):
        if not s:
            return 0
        if s == '拾':
            return 10

        result = 0
        temp = 0
        for char in s:
            if char in num_map:
                temp = num_map[char]
            elif char in unit_map:
                result += temp * unit_map[char]
                temp = 0
        result += temp
        return result

    def parse_amount(s):
        if not s:
            return 0
        if len(s) == 1 and s in num_map:
            return num_map[s]

        if '亿' in s:
            parts = s.split('亿')
            yi_part = parts[0]
            rest_part = parts[1] if len(parts) > 1 else ''
            value = parse_section(yi_part) * 100000000
            if rest_part:
                value += parse_amount(rest_part)
            return value
        elif '万' in s:
            parts = s.split('万')
            wan_part = parts[0]
            rest_part = parts[1] if len(parts) > 1 else ''
            value = parse_section(wan_part) * 10000
            if rest_part:
                value += parse_section(rest_part)
            return value
        else:
            return parse_section(s)

    yuan_value = parse_amount(yuan_part)

    def parse_jiao_fen(jf):
        if not jf:
            return ""

        jiao = 0
        fen = 0

        if '角' in jf and '分' in jf:
            parts = jf.split('角')
            if parts[0] in num_map:
                jiao = num_map[parts[0]]
            fen_part = parts[1].replace('分', '')
            if fen_part in num_map:
                fen = num_map[fen_part]
        elif '角' in jf:
            jiao_part = jf.replace('角', '')
            if jiao_part in num_map:
                jiao = num_map[jiao_part]
        elif '分' in jf:
            fen_part = jf.replace('分', '')
            if fen_part in num_map:
                fen = num_map[fen_part]

        if jiao > 0 and fen > 0:
            return f".{jiao}{fen}"
        elif jiao > 0:
            return f".{jiao}0"
        elif fen > 0:
            return f".0{fen}"
        else:
            return ""

    jf_str = parse_jiao_fen(jiao_fen_part)

    if jf_str:
        return f"{int(yuan_value)}{jf_str}"
    else:
        return str(int(yuan_value))

四、测试验证

我们可以编写一个简单的对比函数来验证转换结果是否正确:

def get_dx_compare(capital_amount, small_amount):
    try:
        capital_to_small = convert_capital_to_small(capital_amount)
        small_amount_clean = small_amount.replace(',', '')
        converted_float = float(capital_to_small)
        expected_float = float(small_amount_clean)
        if converted_float == expected_float:
            print(f"✓ 金额匹配:小写金额 {small_amount}元,大写金额 {capital_amount}")
            return True
        else:
            print(f"✗ 金额不匹配:")
            print(f"  小写金额: {small_amount}")
            print(f"  大写金额: {capital_amount}")
            print(f"  转换结果: {capital_to_small}")
            return False
    except Exception as e:
        print(f"转换出错: {e}")
        return False

运行测试:

get_dx_compare('壹拾陆万元', '160000')  # ✅ 应该输出匹配
get_dx_compare('壹万元', '10000')
get_dx_compare('零元整', '0')
get_dx_compare('壹佰元整', '100')
get_dx_compare('壹仟贰佰叁拾肆元伍角陆分', '1234.56')

输出结果如下:

✓ 金额匹配:小写金额 160000元,大写金额 壹拾陆万元
✓ 金额匹配:小写金额 10000元,大写金额 壹万元
✓ 金额匹配:小写金额 0元,大写金额 零元整
✓ 金额匹配:小写金额 100元,大写金额 壹佰元整
✓ 金额匹配:小写金额 1234.56元,大写金额 壹仟贰佰叁拾肆元伍角陆分

五、总结

本文提供了一个较为完整的中文大写金额转阿拉伯数字的 Python 实现方案,涵盖以下关键点:

  • 数字与单位映射
  • 整数部分层级解析(亿、万、千、百、十)
  • 角分部分精确处理
  • 输入预处理(去空格、去“整”)
  • 结果验证机制

你可以将其用于金融系统中的金额校验、OCR识别后处理、合同文本解析等场景。

以上就是Python实现将中文大写金额转数字金额的详细内容,更多关于Python金额大写转数字的资料请关注脚本之家其它相关文章!

相关文章

  • 在pycharm中输入import torch报错如何解决

    在pycharm中输入import torch报错如何解决

    这篇文章主要介绍了在pycharm中输入import torch报错如何解决问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Python二进制串转换为通用字符串的方法

    Python二进制串转换为通用字符串的方法

    今天小编就为大家分享一篇Python二进制串转换为通用字符串的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 原来我一直安装 Python 库的姿势都不对呀

    原来我一直安装 Python 库的姿势都不对呀

    平常我都是直接执行 pip install 安装的第三方库,很多教程也是这么介绍的,一直以来我都认为这是标准的、正确的安装 Python 第三方库的姿势。下面小编给大家分享一篇教程,一起看看吧
    2019-11-11
  • 超实用的 10 段 Python 案例

    超实用的 10 段 Python 案例

    Python是目前最流行的语言之一,它在数据科学、机器学习、web开发、脚本编写、自动化方面被许多人广泛使用。它的简单和易用性造就了它如此流行的原因。今天这篇文章就给大家分享 10 段超级有用的 Python 案例,需要的朋友可以参考一下
    2021-09-09
  • Python自动化实现日报数据可视化

    Python自动化实现日报数据可视化

    这篇文章主要为大家详细介绍了如何使用Python实现自动化生成日报数据可视化,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-02-02
  • flask框架jinja2模板与模板继承实例分析

    flask框架jinja2模板与模板继承实例分析

    这篇文章主要介绍了flask框架jinja2模板与模板继承,结合实例形式分析了flask框架jinja2模板的基本用法与模板继承相关实现技巧,需要的朋友可以参考下
    2019-08-08
  • 怎样确定K-means算法中的k值

    怎样确定K-means算法中的k值

    这篇文章主要介绍了怎样确定K-means算法中的k值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Python中用altzone()方法处理时区的教程

    Python中用altzone()方法处理时区的教程

    这篇文章主要介绍了Python中用altzone()方法处理时区的教程,是Python入门中的基础知识,需要的朋友可以参考下
    2015-05-05
  • python实现大战外星人小游戏实例代码

    python实现大战外星人小游戏实例代码

    这篇文章主要介绍了python实现大战外星人小游戏,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • django解决跨域请求的问题

    django解决跨域请求的问题

    这篇文章主要介绍了django解决跨域请求的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11

最新评论