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("%",",")