【问题标题】:Formatting percentages with different locale (comma as decimal)使用不同区域设置格式化百分比(逗号为十进制)
【发布时间】:2021-01-13 10:34:12
【问题描述】:

SO 已经充满了许多关于 Python 语言环境设置的问题,这些问题用于格式化具有相应千位和小数分隔符的数字,我认为其中最好的是 here

但是,我一直在尝试通过将其功能扩展到 百分比 来构建此解决方案,但无济于事:

import locale

locale.setlocale(locale.LC_ALL, 'pt_BR.UTF-8')

def pbr(number, isfloat=True):
    if isfloat:
        return locale.format_string('%.2f', number, grouping=True)
    else:
        return locale.format_string('%.2%', number, grouping=True) # Not working

显然'%.2%' 不是有效的格式化程序,但我不知道应该怎么做

In [1]: pbr(81.23421039401, isfloat=False)
Out[1]: '8.123,42%'

此外,考虑到 Python 3.8,这种语言环境解决方案的实现(包括似乎是 Python 2 时代遗留下来的 format_string 函数语法)是否仍然是最佳的?

【问题讨论】:

  • 如文档所述,format_string()“遵循% 运算符的约定”,这意味着您可以使用'%.2f%%' 作为格式字符串。为了向后兼容,它可能是“剩余的”。 % 符号本身是 C printf() 函数的继承。无论如何,请注意结果将是 81,23%,而不是您在问题中显示的内容。
  • 您确定 '%.2%' 是有效的说明符吗?此外,我对您的函数逻辑感到困惑,在示例中,您将浮点数传递给函数,但指定 isfloat=False。如果我是正确的,您正在尝试将美式表示法的浮点数:81.23421039401 转换为欧洲惯例:81,23421039401 并用 '%.2f' 将小数四舍五入为:81,23,并将其设为字符串:' 81,23'?然后,如果它不是浮点数,则返回一个带有其他说明符 '%.2%' 的字符串?
  • @martineau,感谢您提供的信息,我对旧符号一无所知,所以当我必须在 Python 3 中处理它时,它总是让我感到困扰。正如 Anab 的回答所指出的那样,缺乏适当的通过改变函数的实现可以很容易地绕过百分比符号。

标签: python locale number-formatting


【解决方案1】:

查看Python documentationPython reference 的字符串格式,您似乎正在尝试使用“旧格式样式”中的“新格式样式”中的% 运算符,这意味着其他东西.这解释了您的方法失败的原因。

使用语言环境实现您想要的一种方法是进行乘法并自己添加% 符号:

import locale

locale.setlocale(locale.LC_ALL, 'pt_BR.UTF-8')

def pbr(number, isfloat=True):
    if isfloat:
        return locale.format_string('%.2f', number, grouping=True)
    else:
        return locale.format_string('%.2f%%', number*100, grouping=True)

我不能说这在 Python 3.8 中是否仍然是最佳的,我觉得应该有一种方法可以简单地将 string.format 与新样式一起使用,但我还没有找到让它使用语言环境的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多