Python 根据阿拉伯数字生成圆圈数字(①②③…⑳)完整实现教程
一、前言在文档大纲、制度文件、Markdown、Word 自动生成场景里经常需要带圆圈的序号①②③④⑤…⑳用来做最低层级小标题。Python 没有内置方法直接把阿拉伯数字转圆圈数字网上零散代码大多只支持 1-10超过 10 就失效而且缺少统一封装、参数校验、工具类复用方案。本文实现一套完整工具覆盖标准圆圈数字范围120①⑳业务大纲最常用区间输入阿拉伯数字直接输出对应圆圈字符增加参数校验、异常捕获防止越界报错封装通用工具类和之前「中文数字、第X篇、第X部分」函数统一管理配套完整测试用例拿来就能集成到自动化文档项目。二、原理圆圈数字 Unicode 编码对照表带圈数字是独立 Unicode 字符不是文字拼接不能手动(1)替代标准印刷圆圈序号编码区间数字圆圈字符Unicode编码1①U24602②U2461………10⑩U246911⑪U246A12⑫U246B………20⑳U2473规律数字n对应的编码 0x2460 n - 1比如 n10x2460 0 0x2460 → ①n110x2460 10 0x246A → ⑪依靠这个偏移公式无需手动写超长映射字典一行即可算出对应圆圈字符。三、基础转换函数独立可用只支持 120自带类型、范围校验输入数字直接返回圆圈序号。defnum_to_circle_char(n:int)-str: 阿拉伯数字 1~20 转换为圆圈数字 ①②③…⑳ :param n: 输入整数范围 1 ~ 20 :return: 圆圈单个字符例 1→①15→⑮ # 类型校验ifnotisinstance(n,int):raiseTypeError(输入必须为整数类型)# 范围校验ifnot1n20:raiseValueError(当前仅支持 1 ~ 20 的数字转换圆圈序号)# 计算Unicode偏移并转为字符code_point0x2460n-1returnchr(code_point)# 测试代码if__name____main__:test_list[1,5,10,13,18,20]fornumintest_list:resnum_to_circle_char(num)print(f{num}→{res})运行输出1 → ① 5 → ⑤ 10 → ⑩ 13 → ⑬ 18 → ⑱ 20 → ⑳四、异常容错优化版生产环境推荐业务代码不希望直接抛出崩溃异常增加容错超出范围返回空字符串或自定义提示defnum_to_circle_char_safe(n:int,default:str)-str: 安全版数字转圆圈序号不抛异常越界返回默认值 :param n: 目标数字 :param default: 超出范围/类型错误时返回内容 :return: 圆圈字符 / 默认值 try:ifnotisinstance(n,int):returndefaultif1n20:code_point0x2460n-1returnchr(code_point)returndefaultexceptException:returndefault# 测试越界、非法参数print(num_to_circle_char_safe(21))# 空print(num_to_circle_char_safe(0,无))# 无print(num_to_circle_char_safe(abc))# 空print(num_to_circle_char_safe(12))# ⑫五、整合进统一中文编号工具类项目标准化方案结合之前写的「纯中文数字、第X篇、第X部分」转换方法统一封装工具类所有层级编号函数集中管理方便区分调用classChapterNumUtil:digits[,一,二,三,四,五,六,七,八,九]classmethoddefnum_to_plain_chinese(cls,n:int)-str:纯中文数字1→一、15→十五、100→一百ifnotisinstance(n,int)orn1orn100:raiseValueError(仅支持1~100整数)ifn100:return一百tenn//10unitn%10iften0:returncls.digits[unit]eliften1:return十ifunit0elsef十{cls.digits[unit]}else:returnf{cls.digits[ten]}十ifunit0elsef{cls.digits[ten]}十{cls.digits[unit]}classmethoddefnum_to_chinese_article_title(cls,n:int)-str:第X篇1→第一篇returnf第{cls.num_to_plain_chinese(n)}篇classmethoddefnum_to_chinese_part_title(cls,n:int)-str:第X部分1→第一部分returnf第{cls.num_to_plain_chinese(n)}部分classmethoddefnum_to_circle_char(cls,n:int)-str:圆圈序号1→①上限20ifnotisinstance(n,int)ornot1n20:raiseValueError(圆圈序号仅支持1~20)returnchr(0x2460n-1)classmethoddefnum_to_circle_char_safe(cls,n:int,default)-str:无异常安全版圆圈序号try:returncls.num_to_circle_char(n)except(TypeError,ValueError):returndefault# 统一调用示例if__name____main__:utilChapterNumUtilprint(util.num_to_chinese_article_title(3))# 第三篇print(util.num_to_chinese_part_title(12))# 第十二部分print(util.num_to_circle_char(7))# ⑦print(util.num_to_circle_char(19))# ⑲print(util.num_to_circle_char_safe(99,超出范围))# 超出范围六、业务实战场景大纲层级完整搭配制度文档标准层级搭配示例一套工具完成全部编号转换层级0num_to_chinese_article_title(2)→ 第二篇层级1num_to_chinese_part_title(3)→ 第三部分层级2普通阿拉伯数字1、2、3层级3小数1.1、1.2层级6圆圈序号num_to_circle_char(2)→ ②示例拼接输出articleChapterNumUtil.num_to_chinese_article_title(2)circleChapterNumUtil.num_to_circle_char(2)print(f{article}\n 4.1 管理要求\n{circle}业务办理流程)输出第二篇 4.1 管理要求 ② 业务办理流程七、常见踩坑与说明1. 超过20没有标准圆圈字符Unicode 标准带圈数字只提供 ①⑳1-2021及以上无统一印刷圆圈字符业务设计时建议控制层级序号不超过20如需更大数字只能用(21)文本拼接替代。2. 不能用字符串拼接(1)代替圆圈字符(1)是三个普通符号字体排版、对齐、导出Word/Markdown时和原生圆圈字符视觉差异极大规范文档必须使用 Unicode 圆圈字符。3. 传入浮点数报错比如10.0虽然数值等于10但类型是 float会触发类型校验调用前需强制转整数int(num)。4. 编码兼容问题主流编辑器、Word、WPS、浏览器均完美支持U2460~U2473圆圈字符无乱码风险。八、拓展延伸批量生成全部圆圈序号快速打印1-20所有圆圈字符用于调试查看circle_list[num_to_circle_char(i)foriinrange(1,21)]print(circle_list)# [①, ②, ③, ④, ⑤, ⑥, ⑦, ⑧, ⑨, ⑩, ⑪, ⑫, ⑬, ⑭, ⑮, ⑯, ⑰, ⑱, ⑲, ⑳]九、总结圆圈数字本质是连续 Unicode 字符通过固定偏移公式0x2460 n -1快速计算无需冗长字典映射基础函数严格限制范围 120配套安全容错版本适配生产环境与「第X篇、第X部分、纯中文数字」封装到同一个工具类命名统一多层级大纲生成时易于区分调用原生Unicode圆圈字符排版规范适合自动化生成制度、手册、Markdown文档业务开发注意序号上限20超过20需更换(xx)括号格式作为替代方案。