python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python阿拉伯数字生成圆圈数字

Python根据阿拉伯数字生成圆圈数字的完整实现教程详解

作者:detayun

在文档大纲、制度文件、Markdown、Word 自动生成场景里,经常需要带圆圈的序号,下面我们就来看看使用Python实现阿拉伯数字生成圆圈数字的完整过程吧

一、前言

在文档大纲、制度文件、Markdown、Word 自动生成场景里,经常需要带圆圈的序号:①②③④⑤…⑳,用来做最低层级小标题。

Python 没有内置方法直接把阿拉伯数字转圆圈数字,网上零散代码大多只支持 1-10,超过 10 就失效,而且缺少统一封装、参数校验、工具类复用方案。

本文实现一套完整工具:

  1. 覆盖标准圆圈数字范围:1~20(①~⑳),业务大纲最常用区间;
  2. 输入阿拉伯数字,直接输出对应圆圈字符;
  3. 增加参数校验、异常捕获,防止越界报错;
  4. 封装通用工具类,和之前「中文数字、第X篇、第X部分」函数统一管理;
  5. 配套完整测试用例,拿来就能集成到自动化文档项目。

二、原理:圆圈数字 Unicode 编码对照表

带圈数字是独立 Unicode 字符,不是文字拼接,不能手动 (1) 替代,标准印刷圆圈序号编码区间:

数字圆圈字符Unicode编码
1U+2460
2U+2461
10U+2469
11U+246A
12U+246B
20U+2473

规律:数字 n 对应的编码 = 0x2460 + n - 1

比如 n=1:0x2460 + 0 = 0x2460 → ①

n=11:0x2460 + 10 = 0x246A → ⑪

依靠这个偏移公式,无需手动写超长映射字典,一行即可算出对应圆圈字符。

三、基础转换函数(独立可用)

只支持 1~20,自带类型、范围校验,输入数字直接返回圆圈序号。

def num_to_circle_char(n: int) -> str:
    """
    阿拉伯数字 1~20 转换为圆圈数字 ①②③…⑳
    :param n: 输入整数,范围 1 ~ 20
    :return: 圆圈单个字符,例 1→①,15→⑮
    """
    # 类型校验
    if not isinstance(n, int):
        raise TypeError("输入必须为整数类型")
    # 范围校验
    if not 1 <= n <= 20:
        raise ValueError("当前仅支持 1 ~ 20 的数字转换圆圈序号")
    # 计算Unicode偏移并转为字符
    code_point = 0x2460 + n - 1
    return chr(code_point)


# 测试代码
if __name__ == "__main__":
    test_list = [1, 5, 10, 13, 18, 20]
    for num in test_list:
        res = num_to_circle_char(num)
        print(f"{num} → {res}")

运行输出

1 → ①
5 → ⑤
10 → ⑩
13 → ⑬
18 → ⑱
20 → ⑳

四、异常容错优化版(生产环境推荐)

业务代码不希望直接抛出崩溃异常,增加容错,超出范围返回空字符串或自定义提示:

def num_to_circle_char_safe(n: int, default: str = "") -> str:
    """
    安全版数字转圆圈序号,不抛异常,越界返回默认值
    :param n: 目标数字
    :param default: 超出范围/类型错误时返回内容
    :return: 圆圈字符 / 默认值
    """
    try:
        if not isinstance(n, int):
            return default
        if 1 <= n <= 20:
            code_point = 0x2460 + n - 1
            return chr(code_point)
        return default
    except Exception:
        return default

# 测试越界、非法参数
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部分」转换方法,统一封装工具类,所有层级编号函数集中管理,方便区分调用:

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

    @classmethod
    def num_to_plain_chinese(cls, n: int) -> str:
        """纯中文数字:1→一、15→十五、100→一百"""
        if not isinstance(n, int) or n < 1 or n > 100:
            raise ValueError("仅支持1~100整数")
        if n == 100:
            return "一百"
        ten = n // 10
        unit = n % 10
        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篇:1→第一篇"""
        return f"第{cls.num_to_plain_chinese(n)}篇"

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

    @classmethod
    def num_to_circle_char(cls, n: int) -> str:
        """圆圈序号:1→①,上限20"""
        if not isinstance(n, int) or not 1 <= n <= 20:
            raise ValueError("圆圈序号仅支持1~20")
        return chr(0x2460 + n - 1)

    @classmethod
    def num_to_circle_char_safe(cls, n: int, default="") -> str:
        """无异常安全版圆圈序号"""
        try:
            return cls.num_to_circle_char(n)
        except (TypeError, ValueError):
            return default


# 统一调用示例
if __name__ == "__main__":
    util = ChapterNumUtil
    print(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, "超出范围")) # 超出范围

六、业务实战场景:大纲层级完整搭配

制度文档标准层级搭配示例,一套工具完成全部编号转换:

  1. 层级0:num_to_chinese_article_title(2) → 第二篇
  2. 层级1:num_to_chinese_part_title(3) → 第三部分
  3. 层级2:普通阿拉伯数字 1、2、3
  4. 层级3:小数 1.1、1.2
  5. 层级6:圆圈序号 num_to_circle_char(2) → ②

示例拼接输出:

article = ChapterNumUtil.num_to_chinese_article_title(2)
circle = ChapterNumUtil.num_to_circle_char(2)
print(f"{article}\n    4.1 管理要求\n        {circle} 业务办理流程")

输出:

第二篇
    4.1 管理要求
        ② 业务办理流程

七、常见踩坑与说明

1. 超过20没有标准圆圈字符

Unicode 标准带圈数字只提供 ①~⑳(1-20),21及以上无统一印刷圆圈字符,业务设计时建议控制层级序号不超过20;如需更大数字只能用 (21) 文本拼接替代。

2. 不能用字符串拼接(1)代替圆圈字符

(1) 是三个普通符号,字体排版、对齐、导出Word/Markdown时和原生圆圈字符视觉差异极大,规范文档必须使用 Unicode 圆圈字符。

3. 传入浮点数报错

比如 10.0 虽然数值等于10,但类型是 float,会触发类型校验,调用前需强制转整数 int(num)

4. 编码兼容问题

主流编辑器、Word、WPS、浏览器均完美支持 U+2460~U+2473 圆圈字符,无乱码风险。

八、拓展延伸:批量生成全部圆圈序号

快速打印1-20所有圆圈字符,用于调试查看:

circle_list = [num_to_circle_char(i) for i in range(1, 21)]
print(circle_list)
# ['①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩', '⑪', '⑫', '⑬', '⑭', '⑮', '⑯', '⑰', '⑱', '⑲', '⑳']

九、总结

  1. 圆圈数字本质是连续 Unicode 字符,通过固定偏移公式 0x2460 + n -1 快速计算,无需冗长字典映射;
  2. 基础函数严格限制范围 1~20,配套安全容错版本适配生产环境;
  3. 与「第X篇、第X部分、纯中文数字」封装到同一个工具类,命名统一,多层级大纲生成时易于区分调用;
  4. 原生Unicode圆圈字符排版规范,适合自动化生成制度、手册、Markdown文档;
  5. 业务开发注意序号上限20,超过20需更换 (xx) 括号格式作为替代方案。

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

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