在文档自动化处理中,常需将阿拉伯数字转换为规范中文数字,例如1→一、12→十二、23→二十三,并进一步生成“第一篇”“第二部分”等结构化标题。Python标准库无此工具,新手常踩“十几输出一十X”等坑。本文提供完整实现:基础转换函数支持1~100,工具类封装支持“第X篇”“第X部分”,并扩展至百位。
- digits = ["", "一", "二", "三", "四", "五", "六", "七", "八", "九"]
- def num_to_plain_chinese(n: int) -> str:
- """阿拉伯数字1~100转纯中文数字"""
- 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 digits[unit]
- elif ten == 1:
- return "十" if unit == 0 else f"十{digits[unit]}"
- else:
- return f"{digits[ten]}十" if unit == 0 else f"{digits[ten]}十{digits[unit]}"
- # 测试
- for num in [1, 10, 15, 20, 99, 100]:
- print(f"{num} → {num_to_plain_chinese(num)}")
复制代码
核心逻辑:分离十位与个位,单独处理10~19省略“一”(如12→十二),整十(20→二十)省略个位“零”。输入校验防止浮点数、负数或超限值导致下标越界。
业务拓展:生成“第X篇/第X部分”标题时,只需复用纯中文函数拼接前后缀。建议封装为工具类,统一命名规范,便于项目维护。
- class ChineseNumUtil:
- digits = ["", "一", "二", "三", "四", "五", "六", "七", "八", "九"]
- @classmethod
- def num_to_plain_chinese(cls, n: int) -> str:
- # 实现同上,省略重复代码
- pass
- @classmethod
- def num_to_article_title(cls, n: int) -> str:
- return f"第{cls.num_to_plain_chinese(n)}篇"
- @classmethod
- def num_to_part_title(cls, n: int) -> str:
- return f"第{cls.num_to_plain_chinese(n)}部分"
复制代码
调用示例:- util = ChineseNumUtil
- print(util.num_to_article_title(1)) # 第一篇
- print(util.num_to_part_title(12)) # 第十二部分
复制代码
常见踩坑:
- 十几误输出“一十三”:需单独分支省略十位的“一”;
- 未校验输入类型/范围:函数应主动抛异常;
- 复制粘贴多套转换逻辑:抽离公共函数,仅在上层拼接前后缀;
- 函数命名混乱:采用统一命名如 num_to_chinese_xxx_title,后缀区分层级。
简易扩展支持百位(101~199):- def num_to_plain_chinese_extend(n: int) -> str:
- if 101 <= n <= 199:
- rest = n - 100
- return "一百" + (num_to_plain_chinese(rest) if rest else "")
- return num_to_plain_chinese(n)
复制代码
该方案适用于制度大纲、Markdown目录、Word文档自动化生成等场景。开发者可按需扩展至千、万级大数,只需增加更高位运算逻辑。 |