Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.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_Format_Decimal - Fatal编程技术网

Python 如何打印带有数千个分隔符的浮点?

Python 如何打印带有数千个分隔符的浮点?,python,format,decimal,Python,Format,Decimal,如何设置十进制数的格式,使32757121.33显示为32.757.121,33?使用: 您可以将区域设置更改限制为数字值的显示(使用locale.format(),locale.str()等时),并使其他区域设置不受影响: >>> locale.setlocale(locale.LC_NUMERIC, 'English') 'English_United States.1252' >>> print(locale.format('%.2f', 3275712

如何设置十进制数的格式,使
32757121.33
显示为
32.757.121,33

使用:

您可以将区域设置更改限制为数字值的显示(使用
locale.format()
locale.str()
等时),并使其他区域设置不受影响:

>>> locale.setlocale(locale.LC_NUMERIC, 'English')
'English_United States.1252'
>>> print(locale.format('%.2f', 32757121.33, True))
32,757,121.33
>>> locale.setlocale(locale.LC_NUMERIC, 'German')
'German_Germany.1252'
>>> print(locale.format('%.2f', 32757121.33, True))
32.757.121,33

如果出于某种原因不能或不想使用
locale
,也可以使用正则表达式:

import re
def sep(s, thou=",", dec="."):
    integer, decimal = s.split(".")
    integer = re.sub(r"\B(?=(?:\d{3})+$)", thou, integer)
    return integer + dec + decimal
sep()

>>> s = "%.2f" % 32757121.33
>>> sep(s)
'32,757,121.33'
>>> sep(s, thou=".", dec=",")
'32.757.121,33'
说明:

\B      # Assert that we're not at the start of the number
(?=     # Match at a position where it's possible to match...
 (?:    #  the following regex:
  \d{3} #   3 digits
 )+     #  repeated at least once
 $      #  until the end of the string
)       # (thereby ensuring a number of digits divisible by 3

我找到了另一个解决方案:

'{:,.2f}'.format(num).replace(".","%").replace(",",".").replace("%",",")

@在德国AshwiniChaudhary,原始的海报格式是正常的。更麻烦的是,这些调用取决于O.S.可用的区域设置。此外,区域设置名称wll在不同的O.S.甚至不同的Linux发行版中有所不同(这意味着您必须在生产服务器上测试这一点,或者在找到现有区域设置之前使用提供回退功能的代码)@jsbueno:Good point。文档还指出,
setlocale()
不是线程安全的,并且还有一些其他问题,特别是在大型多模块程序中使用时,因此阅读文档非常重要。在一个小程序中,这一点可以说没有那么重要。此外,还有其他区域名称,如
en_en
de_de
,可能比
德语
等更通用;I但是还没有找到允许的区域设置列表。所以我遇到了这样一个问题:“呈现时捕获错误:不支持的区域设置设置ti”我尝试了不同的变体(德语、德语、de_de和其他)。我可以不使用区域设置吗?使用inly格式吗?您运行程序的平台是什么?问题是它不是线程安全的,并且假设开发人员希望程序中的每个地方都有相同的效果(除非可以不断地来回切换,这是令人讨厌的)。应该有一种方法可以在给定的区域设置中格式化值,而不必将整个运行时平台设置为该区域设置。例如,locale.format(format_string,value,locale)-唉,这些似乎都没有。非常感谢!如果您感兴趣,我还发现了这个变体“{:20.2f}”。format(num)。replace(“,%”)。replace(“,”,“,”).replace(“%”,“,”))为什么要在你可以使用的时候创建解释部分。糟糕的解决方案。如果这被调用在数千个任意长度的字符串上会怎么样?这在
…(num)
之后就没有那么多废话了。漂亮的解决方案,让编译器完成他们的工作:)是的,这很糟糕,我现在正微笑着看着它。但它早在2012年就起作用了:D
'{:,.2f}'.format(num).replace(".","%").replace(",",".").replace("%",",")