Подтвердить что ты не робот

Как распечатать поплавок с разделителями тысяч?

Как я могу отформатировать десятичное число, чтобы 32757121.33 отображалось как 32.757.121,33?

4b9b3361

Ответ 1

Используйте 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

Ответ 2

Я нашел другое решение:

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

Ответ 3

Если вы не можете или не хотите использовать 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 и возвращает его с пользовательскими тысячами и десятичными разделителями.

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