python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python阿拉伯数字转中文

Python根据阿拉伯数字生成中文汉字数字的完整教程

作者:detayun

本文将手把手教你用Python实现1-99及百位数字转换,轻松生成第X篇、第X部分等文档标题,避开常见踩坑点,复制代码即可直接用于大纲生成和文档自动化

一、前言

在文档处理、大纲生成、制度文件、报表标题等开发场景中,我们经常需要把阿拉伯数字转换成规范中文数字,比如:
1 → 一、10 → 十、15 → 十五、23 → 二十三,再衍生出结构化标题:第一篇、第十五部分、第三十五章等。

Python 标准库没有内置数字转中文的工具函数,很多新手自己写逻辑时容易踩坑:十几的特殊读法、整十省略个位、拼接标题前缀后缀混乱等问题。

本文分三层实现:

  1. 基础版:1~99 纯中文数字转换(一、十、二十三);
  2. 拓展版:封装成通用工具,支持生成「第X篇、第X部分」标准文档标题;
  3. 高阶扩展:简单拓展支持百位数,可自行延伸千、万级大数。

全部代码可直接复制使用,适配制度大纲、Markdown、Word 文档自动化生成场景。

二、基础需求分析(1~99中文数字规则)

先梳理中文数字固定语法规则,这是编写代码的核心依据:

  1. 1~9:直接输出「一、二…九」;
  2. 10~19:十位只读「十」,10 = 十、13 = 十三,十位不带一
  3. 20~99:十位+十+个位,整十省略个位,20 = 二十、25 = 二十五;
  4. 100:单独处理为「一百」。

三、基础函数:纯数字转中文(1~100)

完整代码

def num_to_plain_chinese(n: int) -> str:
    """
    阿拉伯数字 1~100 转为纯中文数字
    :param n: 输入整数 1 - 100
    :return: 纯中文数字字符串
    """
    if not isinstance(n, int):
        raise TypeError("输入必须为整数")
    if n < 1 or n > 100:
        raise ValueError("当前仅支持 1 ~ 100 的数字转换")

    digits = ["", "一", "二", "三", "四", "五", "六", "七", "八", "九"]
    # 分离十位、个位
    ten_digit = n // 10
    unit_digit = n % 10

    if n == 100:
        return "一百"
    # 个位数 1-9
    if ten_digit == 0:
        return digits[unit_digit]
    # 十位数 10-19
    elif ten_digit == 1:
        if unit_digit == 0:
            return "十"
        else:
            return f"十{digits[unit_digit]}"
    # 二十~九十九
    else:
        if unit_digit == 0:
            return f"{digits[ten_digit]}十"
        else:
            return f"{digits[ten_digit]}十{digits[unit_digit]}"


# 测试用例
if __name__ == "__main__":
    test_nums = [1, 5, 10, 12, 15, 20, 36, 99, 100]
    for num in test_nums:
        print(f"{num} → {num_to_plain_chinese(num)}")

运行输出

1 → 一
5 → 五
10 → 十
12 → 十二
15 → 十五
20 → 二十
36 → 三十六
99 → 九十九
100 → 一百

代码关键点说明

  1. 校验输入:限制整数范围,防止非法数字报错;
  2. 数字映射数组 digits:下标对应中文,空字符串占位规避0的干扰;
  3. 分段逻辑区分 个位数、十几、几十几,解决中文特殊读法;
  4. 单独处理100,适配长文档百级章节场景。

四、业务拓展:生成规范文档标题(第X篇/第X部分)

实际开发中,单纯的中文数字很少单独使用,更多搭配前缀「第」、后缀「篇/部分/章」生成大纲标题。
基于上面基础函数封装通用工具,统一命名规范,方便区分不同层级标题转换函数。

4.1 转换为「第X篇」标题函数

def num_to_chinese_article_title(n: int) -> str:
    """数字转 第一篇、第十篇、第十五篇 格式标题"""
    chinese_str = num_to_plain_chinese(n)
    return f"第{chinese_str}篇"


# 测试
print(num_to_chinese_article_title(1))   # 第一篇
print(num_to_chinese_article_title(15))  # 第十五篇
print(num_to_chinese_article_title(20))  # 第二十篇
print(num_to_chinese_article_title(99))  # 第九十九篇

4.2 转换为「第X部分」标题函数

def num_to_chinese_part_title(n: int) -> str:
    """数字转 第一部分、第十三部分 格式标题"""
    chinese_str = num_to_plain_chinese(n)
    return f"第{chinese_str}部分"

print(num_to_chinese_part_title(12))  # 第十二部分

4.3 统一工具类封装(项目推荐写法)

多个转换函数整合为工具类,导入一处全局使用,命名区分层级,便于后期维护:

class ChineseNumUtil:
    digits = ["", "一", "二", "三", "四", "五", "六", "七", "八", "九"]

    @classmethod
    def num_to_plain_chinese(cls, n: int) -> str:
        if not isinstance(n, int):
            raise TypeError("输入必须为整数")
        if n < 1 or n > 100:
            raise ValueError("仅支持 1 ~ 100")
        ten = n // 10
        unit = n % 10
        if n == 100:
            return "一百"
        if ten == 0:
            return cls.digits[unit]
        elif ten == 1:
            return "十" if unit == 0 else f"十{cls.digits[unit]}"
        else:
            return f"{cls.digits[ten]}十" if unit == 0 else f"{cls.digits[ten]}十{cls.digits[unit]}"

    @classmethod
    def num_to_chinese_article_title(cls, n: int) -> str:
        """第X篇"""
        return f"第{cls.num_to_plain_chinese(n)}篇"

    @classmethod
    def num_to_chinese_part_title(cls, n: int) -> str:
        """第X部分"""
        return f"第{cls.num_to_plain_chinese(n)}部分"


# 调用示例
if __name__ == "__main__":
    util = ChineseNumUtil
    print(util.num_to_plain_chinese(15))
    print(util.num_to_chinese_article_title(15))
    print(util.num_to_chinese_part_title(15))

五、常见开发踩坑点

坑1:十几数字错误输出「一十X」

很多新手直接拼接 一十,出现「一十三」,不符合中文阅读习惯。

解决办法:单独判断十位等于1的分支,省略十位的「一」。

坑2:未做输入校验,传入浮点数、负数、超大数字

传入 10.5-3200 会直接数组下标越界。

解决办法:函数开头增加类型、范围校验,主动抛出异常方便调试。

坑3:多个标题转换逻辑重复,复制粘贴冗余代码

分别写「篇」「部分」两套数字转换逻辑,后期修改要多处改动。

解决办法:抽离底层纯数字转换公共函数,上层仅拼接前后缀。

坑4:函数命名混乱,无法区分层级

直接命名 convert_num,后期新增1.1、(1)、① 等格式转换时难以区分。

解决办法:采用统一命名规范:num_to_chinese_xxx_title,后缀区分篇、部分、小节。

六、简单扩展:支持百以上大数(简易版)

如果业务需要超过100的数字,可简单扩展百位逻辑,示例:

def num_to_plain_chinese_extend(n: int) -> str:
    digits = ["", "一", "二", "三", "四", "五", "六", "七", "八", "九"]
    if n == 100:
        return "一百"
    if 101 <= n <= 199:
        hundred = "一百"
        rest = n - 100
        if rest == 0:
            return hundred
        return hundred + num_to_plain_chinese(rest)
    # 其余复用原有逻辑
    ten_digit = n // 10
    unit_digit = n % 10
    if ten_digit == 0:
        return digits[unit_digit]
    elif ten_digit == 1:
        return "十" if unit_digit == 0 else f"十{digits[unit_digit]}"
    else:
        return f"{digits[ten_digit]}十" if unit_digit == 0 else f"{digits[ten_digit]}十{digits[unit_digit]}"

print(num_to_plain_chinese_extend(115)) # 一百十五

七、总结

  1. 中文数字转换核心是拆分十位、个位,特殊处理10~19省略「一」的语法;
  2. 分层开发:底层公共函数输出纯中文数字,上层封装各类文档标题格式;
  3. 工具类集中管理转换逻辑,统一命名,便于项目维护和扩展;
  4. 增加输入校验,规避非法参数导致的程序崩溃;
  5. 可根据业务需求自由拓展后缀,快速生成「第X章、第X节」等标准化大纲标题,广泛应用于文档自动化、爬虫文本处理、报表生成场景。

到此这篇关于Python根据阿拉伯数字生成中文汉字数字的完整教程的文章就介绍到这了,更多相关Python阿拉伯数字转中文内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文