Python 中是否有一种简单且首选的德语数字字符串格式设置方式?
Is there a simple and preferred way of German number string formatting in Python?
我正在 Windows OS 下的 Python 中搜索德语数字格式(例如 1.000,1234
)的正确方法。
我尝试了 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.setlocale
将语言环境设置为 de
,然后使用 locale.format
格式化您的号码:
import locale
locale.setlocale(locale.LC_ALL, 'de')
print(locale.format('%.4f', 1000.1234, 1))
这输出:
1.000,1234
如果由于某种原因 locale
对您不起作用(或不需要),那么最简单的其他选择可能是使用字符串替换,如 this already mentioned answer (which draws its answer from the PEP-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
我正在 Windows OS 下的 Python 中搜索德语数字格式(例如 1.000,1234
)的正确方法。
我尝试了 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.setlocale
将语言环境设置为 de
,然后使用 locale.format
格式化您的号码:
import locale
locale.setlocale(locale.LC_ALL, 'de')
print(locale.format('%.4f', 1000.1234, 1))
这输出:
1.000,1234
如果由于某种原因 locale
对您不起作用(或不需要),那么最简单的其他选择可能是使用字符串替换,如 this already mentioned answer (which draws its answer from the PEP-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