【问题标题】:Is there a simple and preferred way of German number string formatting in Python?Python中是否有一种简单且首选的德语数字字符串格式化方式?
【发布时间】:2026-02-20 23:00:02
【问题描述】:

我正在 Windows 操作系统下的 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 做了什么尝试?也许您的平台不支持它?在这里查看许多答案:*.com/questions/14287051/…

标签: python python-3.x localization locale string-formatting


【解决方案1】:

您可以使用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()
【解决方案2】:

如果由于某种原因 locale 对您不起作用(或不需要),那么最简单的其他选择可能是使用字符串替换,就像在 this already mentioned answer 中建议的那样(它的答案来自 @987654322 @)。

你总是可以将它封装在一个函数中,可能是这样的:

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', '.')

这适用于intfloatDecimal

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

【讨论】:

  • 我能够将这个函数编辑成可以在欧元格式的货币前面显示欧元符号的东西——比担心语言环境要简洁得多
【解决方案3】:

感谢您的帮助。如果有人觉得这很有用,我会在此处提供最终解决方案的代码。

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

【讨论】:

    最近更新 更多