Я ищу правильный способ форматирования немецких чисел (например, 1.000,1234
) в Python под ОС Windows.
Я пытался locale.setlocale
но не получилось.
Вместо этого я написал функцию для получения желаемого результата.
Есть ли способ лучше?
def ger_num(number, precision=3):
"""
returns german formatted number as string or an empty string
"""
if number is not None:
try:
my_number = "{:,f}".format(number)
except ValueError:
return ""
decimals, fraction = my_number.split(".")[0], my_number.split(".")[1]
decimals = decimals.replace(",", ".")
if precision:
return decimals + "," + fraction[:precision]
else:
return decimals
else:
return ""
Что именно вы пробовали с locale
? Возможно, ваша платформа не поддерживает его? См. множество ответов здесь: stackoverflow.com/questions/14287051/…
Вы можете использовать locale.setlocale
, чтобы установить локаль на de
, а затем использовать locale.format
, чтобы отформатировать свой номер:
import locale
locale.setlocale(locale.LC_ALL, 'de')
print(locale.format('%.4f', 1000.1234, 1))
Это выводит:
1.000,1234
В Debian вы можете проверить свои конкретные идентификаторы локали, запустив locale -a
, и если они отсутствуют, проверьте man locale-gen
. Я использую de_DE.utf8
. Кроме того, locale.format
устарела в Python 3.7. Вместо этого используйте locale.format_string()
.
Если по какой-то причине locale
не работает для вас (или нежелательно), то самым простым другим вариантом, вероятно, будет использование замены строки, как это предлагается в этот уже упомянутый ответ (который берет свой ответ из ПЭП-378).
Вы всегда можете инкапсулировать это в функцию, например:
def format_number(number, precision=3):
# build format string
format_str = '{{:,.{}f}}'.format(precision)
# make number string
number_str = format_str.format(number)
# replace chars
return number_str.replace(',', 'X').replace('.', ',').replace('X', '.')
Это хорошо работает для int
, float
и Decimal
:
>>> format_number(1)
'1,000'
>>> format_number(1, 2)
'1,00'
>>> format_number(1, 7)
'1,0000000'
>>> format_number(1234567, 7)
'1.234.567,0000000'
>>> format_number(1234567.9988, 7)
'1.234.567,9988000'
>>> format_number(1234567.9988, 2)
'1.234.568,00'
>>> from decimal import Decimal
>>> format_number(Decimal('1234567.9988'), 2)
'1.234.568,00'
>>> format_number(Decimal('1234567.9988'), 5)
'1.234.567,99880'
>>> format_number(Decimal('1234567.9988'), 0)
'1.234.568'
>>> format_number(Decimal('123456'), 5)
'123.456,00000'
Я смог отредактировать эту функцию во что-то, что позволило мне отображать символ евро перед валютой в формате евро - гораздо лучше, чем беспокоиться о локали.
Спасибо за помощь. Если кто-то найдет это полезным, я предоставляю здесь код для моего окончательного решения.
ger_num.py:
def ger_num(number, digits=2):
'''
retruns <number> as german formattet string (thousands-.),
rounds to n <digits>.
<number> == None OR (!= INT AND != FLOAT) returns '' (empty STR)
'''
import locale
locale.setlocale(locale.LC_ALL, 'de')
if number is None:
return ''
if not isinstance(number, int) and not isinstance(number, float):
return ''
else:
format = '%.'+str(digits)+'f'
return locale.format_string(format, number, 1)
if __name__ == "__main__":
pass
пожалуйста, предоставьте четкое описание ваших входов и выходов.