Существует ли простой и предпочтительный способ форматирования немецких числовых строк в Python? - PullRequest
4 голосов
/ 10 апреля 2019

Я ищу правильный способ немецкого форматирования чисел (например, 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 ""

Ответы [ 3 ]

3 голосов
/ 10 апреля 2019

Вы можете использовать locale.setlocale, чтобы установить языковой стандарт на de, а затем использовать locale.format, чтобы отформатировать ваш номер:

import locale
locale.setlocale(locale.LC_ALL, 'de')
print(locale.format('%.4f', 1000.1234, 1))

Это выводит:

1.000,1234
0 голосов
/ 21 мая 2019

Спасибо за помощь.Если кто-то найдет это полезным, я предоставлю код моего окончательного решения здесь.

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
0 голосов
/ 10 апреля 2019

Если по какой-то причине locale не работает для вас (или нежелательно), то, возможно, проще всего использовать замену строки, как предложено в в этом уже упомянутом ответе (которыйберет ответ из 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'
...