Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

PEP 378 – 千位分隔符的格式说明符

作者:
Raymond Hettinger <python at rcn.com>
状态:
最终版
类型:
标准跟踪
创建日期:
2009年3月12日
Python 版本:
2.7, 3.1
发布历史:
2009年3月12日

目录

动机

提供一种简单、不依赖区域设置的方式来格式化带千位分隔符的数字。

添加千位分隔符是使程序输出人性化的最简单方法之一,可以提高其专业外观和可读性。

在金融领域,带千位分隔符的输出是常态。金融用户和非专业程序员认为区域设置方法令人沮丧、神秘且不明显。

locale 模块还存在另外两个挑战。首先,它是一个全局设置,不适用于需要以多种区域设置提供请求的多线程应用程序。其次,相关区域设置的名称(例如“de_DE”)可能因平台而异,或者可能根本未定义。locale 模块的文档详细描述了这些以及许多其他挑战

目标不是取代 locale 模块、执行国际化任务或适应所有可能的约定。这些任务更适合像 Babel 这样的健壮工具。相反,目标是让许多用户更容易完成常见的日常任务。

主要提案(来自 Alyssa Coghlan,最初称为提案一)

将在 format() 说明符迷你语言中添加一个逗号

[[fill]align][sign][#][0][width][,][.precision][type]

',' 选项表示输出中应包含逗号作为千位分隔符。与不使用句点作为小数点的区域设置一样,使用不同数字分隔约定的区域设置将需要使用 locale 模块来获得适当的格式。

该提案适用于浮点数、整数和 Decimal 类型。它还允许轻松替换其他分隔符。例如

format(n, "6,d").replace(",", "_")

这种技术完全通用,但在逗号和句点需要交换的情况下会很笨拙

format(n, "6,f").replace(",", "X").replace(".", ",").replace("X", ".")

宽度参数表示包括逗号和小数点在内的总长度

format(1234, "08,d")     -->    '0001,234'
format(1234.5, "08,.1f") -->    '01,234.5'

',' 选项如上所示定义,适用于类型 'd'、'e'、'f'、'g'、'E'、'G'、'%' 和 'F'。为了允许将来的扩展,它对其他类型(二进制、八进制、十六进制、字符等)是未定义的。

该提案的优点是比替代提案更简单,但灵活性大大降低,开箱即用就能满足的用户需求更少。预计会为指定替代分隔符提供其他解决方案。

迷你语言的当前版本

对其他语言做法的研究

浏览网页,我发现千位分隔符通常是逗号、句点、空格、撇号或下划线之一。

C-Sharp 提供了两种样式(图片格式和类型说明符)。类型说明符方法是区域设置感知的。图片格式只提供逗号作为千位分隔符

String.Format("{0:n}", 12400)     ==>    "12,400"
String.Format("{0:0,0}", 12400)   ==>    "12,400"

Common Lisp~D 十进制类型说明符之前使用冒号来发出逗号作为千位分隔符。~D 的一般形式是 ~mincol,padchar,commachar,commaintervalDpadchar 默认为 SPACE。commachar 默认为 COMMA。commainterval 默认为三。

(format nil "~:D" 229345007)   =>   "229,345,007"
  • ADA 语言允许在其数字文字中使用下划线。

Visual Basic 及其同类(例如 MS Excel)使用完全不同的样式,并具有超灵活的自定义格式说明符,例如

"_($* #,##0_)".

COBOL 使用图片子句,例如

PICTURE $***,**9.99CR

Java 提供了 Decimal.Format 类,它使用图片模式(一个用于正数,一个可选用于负数),例如:"#,##0.00;(#,##0.00)"。它允许任意分组,包括百位和万位,以及不均匀的分组。特殊模式字符是非本地化的(使用句点作为小数点分隔符,使用逗号作为分组分隔符)。用户可以使用格式化程序的 DecimalFormatSymbols 对象提供一组替代符号。

替代提案(来自 Eric Smith,最初称为提案二)

使千位分隔符和小数点分隔符都可由用户指定,但不依赖于区域设置。为简单起见,将选择限制为逗号、句点、空格、撇号或下划线。空格可以是 U+0020 或 U+00A0。

当分隔符后跟精度时,它是一个小数点分隔符,其前面的可选分隔符是一个千位分隔符。当精度不存在时,单独的说明符表示千位分隔符

[[fill]align][sign][#][0][width][tsep][dsep precision][type]

示例

format(1234, "8.1f")     -->    '  1234.0'
format(1234, "8,1f")     -->    '  1234,0'
format(1234, "8.,1f")    -->    ' 1.234,0'
format(1234, "8 ,f")     -->    ' 1 234,0'
format(1234, "8d")       -->    '    1234'
format(1234, "8,d")      -->    '   1,234'
format(1234, "8_d")      -->    '   1_234'

该提案满足了大多数需求,但代价是需要付出更多的解析努力。并非所有可能的约定都涵盖在内,但至少其中一个选项(空格或下划线)对于来自各种背景的人们来说应该是可读、可理解和有用的。

如示例所示,宽度参数表示包括千位分隔符和小数点分隔符在内的总长度。

对 locale 模块不作任何更改。

千位分隔符如上所示定义,适用于类型 'd'、'e'、'f'、'g'、'%'、'E'、'G' 和 'F'。为了允许将来的扩展,它对其他类型(二进制、八进制、十六进制、字符等)是未定义的。

这个替代提案的缺点是很难在精神上解析单个分隔符是千位分隔符还是小数点分隔符。也许将小数点分隔符与精度说明符联系起来太神秘了。

评论

  • 一些评论者根本不喜欢格式字符串的想法,并认为它们难以阅读。建议的替代方案包括 COBOL 样式 PICTURE 方法或带有关键字参数的便利函数,用于所有可能的组合。
  • 一些新闻组回复者认为,所有未国际化的脚本都没有立足之地,提供一种简单的方式来硬编码特定选择是一种倒退(从而降低了使用区域设置敏感方法的动机)。
  • 另一个想法是,在单个格式字符串中嵌入一些特定约定会使以后更改该约定变得困难。没有提出可行的替代方案,但一般想法是设置一次约定并使其到处适用(其他人评论说 locale 已经提供了这样做的方法)。
  • 对于浮点数小数部分的数字分组有一些先例,但本 PEP 不涉及该领域。只对小数点左侧的数字进行分组。这不排除未来的扩展;它只是专注于格式化语言的一个单一、普遍有用的扩展。
  • James Knight 观察到印度/巴基斯坦的数字系统按百位分组。Ben Finney 指出中国按万位分组。Eric Smith 指出这些已经由 locale 模块中的“n”说明符处理(尽管仅适用于整数)。本 PEP 不尝试支持所有这些可能性。它专注于一种单一、相对常见的分组约定,它提供了一种快速方法来提高许多(尽管不是所有)上下文中的可读性。

来源:https://github.com/python/peps/blob/main/peps/pep-0378.rst

最后修改时间:2025-02-01 08:59:27 GMT