Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用不同区域设置格式化百分比(逗号为十进制)_Python_Locale_Number Formatting - Fatal编程技术网

Python 使用不同区域设置格式化百分比(逗号为十进制)

Python 使用不同区域设置格式化百分比(逗号为十进制),python,locale,number-formatting,Python,Locale,Number Formatting,因此,关于Python的语言环境设置,已经有很多问题了,这些问题是如何用相应的千分位数和小数点分隔符格式化一个数字的,我认为最好的是找到了 但是,我一直在尝试通过将其功能扩展到百分比来构建此解决方案,但没有成功: import locale locale.setlocale(locale.LC_ALL, 'pt_BR.UTF-8') def pbr(number, isfloat=True): if isfloat: return locale.format_stri

因此,关于Python的语言环境设置,已经有很多问题了,这些问题是如何用相应的千分位数和小数点分隔符格式化一个数字的,我认为最好的是找到了

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

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%'
另外,考虑到Python3.8,区域设置解决方案的这种实现(包括似乎是Python2时代遗留下来的
格式字符串
函数语法)仍然是最佳的吗?

查看字符串格式,似乎您正试图使用“新格式样式”中的
%
操作符在“旧格式样式”中,它意味着其他内容。这就解释了你的方法失败的原因

使用区域设置实现所需的一种方法是执行乘法并添加
%
签名:

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,但我还没有找到使它使用区域设置的方法。

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