Как отформатировать число с запятой и указанными точными цифрами в Python

вопрос для Python 2.6, это то, что у нас есть в производстве.

у меня есть это требование для форматирования числа (например, 1234567.0987 или 1234567.0) с запятой и указанным количеством цифр после десятичных знаков. Итак, если точность равна трем, 1234567.0987 может выглядеть как 1,234,567.099.

Я попытался использовать Locale, как предложено ответами на многие вопросы, проблема в том, что результаты в двух цифрах после десятичного знака, что неприемлемо для моего требования.

Я пробовал искать в других местах, но не нашел никакого решения, и, наконец, я создал собственный метод:

def format_float(value, precision = 4):
    formatString = "%0." + str(precision) + "f"    
    str_val =  formatString % value
    first, second = str_val.split('.')
    first = int(first)
    group = []
    while True:
        result, mod = first / 1000, first % 1000
        group.append(str(mod))
        if result == 0:
            break
        first = result
    group.reverse() 
    return ','.join(group) + '.' + second

Я попытался запустить некоторые тесты, чтобы проверить метод, и он отлично работает:

# default 4 digits precision
assert format_float(1234567890.0876543) == '1,234,567,890.0877'
assert format_float(1.2) == '1.2000'
assert format_float(1234) == '1,234.0000'
assert format_float(0) == '0.0000'

# 3 digits precision
assert format_float(1234567890.0876543, precision=3) == '1,234,567,890.088'
assert format_float(0, precision=3) == '0.000'

будучи новым для Python, мой вопрос заключается в том, является ли это приемлемым решением. Поскольку это форматирование должно выполняться много раз в тесном цикле for-loop, я был бы признателен, если кто-то может указать на лучшее решение.

спасибо и привет Все!--3-->

2 ответов


Я не думаю, что вы достаточно глубоко заглянули в модуль локали. locale.format() это то, что вы хотите, но убедитесь, что вы сначала установили локаль, или вы не получите группировку вообще.

>>> locale.setlocale(locale.LC_ALL, '')
'en_US.UTF-8'
>>> locale.format("%.4f", 12345.678912, grouping=True)
'12,345.6789'

для python 2.7 и 3.X вы можете сделать что-то вроде:

>>> num=1234567890.0876543
>>> "{0:,f}".format(num)
'1,234,567,890.087654'
>>> "{0:,.2f}".format(num)
'1,234,567,890.08'
>>> "{0:,f}".format(1234)
'1,234.000000'