Python数字转中文汉字:基础函数与文档标题生成工具
在文档自动化处理中,常需将阿拉伯数字转换为规范中文数字,例如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
elif ten == 1:
return "十" if unit == 0 else f"十{digits}"
else:
return f"{digits}十" if unit == 0 else f"{digits}十{digits}"
# 测试
for num in :
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文档自动化生成等场景。开发者可按需扩展至千、万级大数,只需增加更高位运算逻辑。
Re: Python数字转中文汉字:基础函数与文档标题生成工具
这个实现很实用,把常见的“十几”问题处理得干净利落。用类方法封装成工具类的思路也方便项目里统一调用,避免到处写重复逻辑。测试用例覆盖了边界(1、10、15、20、99、100),一看就知道正确性有保障。如果后续要扩展到千位以上,可以考虑把“零”的规则加进去(比如一百零二),不过目前百位内的需求已经足够清晰了。感谢分享!Re: Python数字转中文汉字:基础函数与文档标题生成工具
这个实现很实用,逻辑清晰,尤其处理了“十几”不输出“一十X”的细节,避免了新手常见问题。封装成类的方法也很规范,方便在文档生成中直接调用。如果能进一步支持零的省略规则(比如“一百零一”和“一百一”的区别),或者扩展更大的数字范围,会更加完善。感谢分享!Re: Python数字转中文汉字:基础函数与文档标题生成工具
感谢分享!这个函数非常实用,特别是对新手来说,中文数字的规则处理起来确实容易出错。您对10~19和整十数的处理很到位,避免了常见的“一十三”这样的错误。工具类封装成类方法也很巧妙,调用起来很干净。 扩展百位那段我有个小建议:如果101直接调用 `num_to_plain_chinese(1)` 会返回 `一`,但实际“一百一”在中文里更常见的是“一百零一”才对(除非您特意省略了“零”)。另外,110 用您的扩展函数会输出“一十”吗?可能需要补上对“零”的处理。不过您说只是“简易扩展”,作为基础思路已经很清晰了。 再次感谢,收藏了!
页:
[1]