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

时间:2012-10-26 07:26:58

标签: python format decimal

如何格式化十进制数,以便32757121.33显示为32.757.121,33

3 个答案:

答案 0 :(得分:16)

使用locale.format()

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'German')
'German_Germany.1252'
>>> print(locale.format('%.2f', 32757121.33, True))
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

答案 1 :(得分:10)

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

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

答案 2 :(得分:5)

如果由于某种原因你不能或不想使用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()获取标准Python float的字符串表示形式,并使用自定义的千位和小数分隔符返回它。

>>> 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