Существует много устоявшихся ответов о том, как печатать числа с запятыми и / или десятичными знаками, примеры здесь , здесь , здесь и т. Д.
По какой-то причине я не могу найти четкий ответ о том, как сделать это для больших чисел с десятичными знаками с учетом локали, что не заставляет меня точно кодировать (например, при чтении файла и печатизначения из него, без предварительного знания того, насколько большими или точными будут цифры).
Чтобы все усложнить, я также надеюсь сделать это кросс-совместимым способом Python 2.7 / 3.x.
Итак, если бы у меня было такое число, как 1000000.01
, я бы хотел, чтобы оно было напечатано как "1,000,000.01", а 1000000.00001
как "1,000,000.00001".
Вот методы, которые я пробовалкоторые не работают:
(используя стандартный форматировщик строки )
# https://docs.python.org/2.7/library/string.html#format-specification-mini-language
x = 1000000.01
print("{:n}".format(x)) # 1e+06 ; locale-aware but doesn't work?
print("{:g}".format(x)) # 1e+06 ; doesn't work
print("{:f}".format(x)) # 1000000.010000 ; wrong number of decimal places
print("{:,}".format(x)) # 1,000,000.01 ; desired result but not locale-aware (?)
на основе документов, "{:n}"
звучит как то, что я хочу, но не похожена самом деле работать."{:,}"
дает желаемый результат, но, кажется, не учитывает локали (согласно перечисленным документам; требуется пояснение по этому вопросу).
(с использованием locale
library )
# https://docs.python.org/2/library/locale.html
import locale
locale.setlocale(locale.LC_ALL, '')
print(locale.format("%g", x, grouping = True)) # 1e+06 ; doesn't work
print(locale.format("%d", x, grouping = True)) # 1,000,000 ; loses decimal place
# print(locale.format("%n", x, grouping = True)) # ValueError: format() must be given exactly one %char format specifier, '%n' not valid
# print(locale.format("{:n}", x, grouping = True)) # ValueError: format() must be given exactly one %char format specifier, '{:n}' not valid
print(locale.format_string("%g", x, grouping = True)) # 1e+06 ; doesn't work
# print(locale.format_string("%n", x, grouping = True)) # TypeError: not enough arguments for format string
print(locale.format_string("{:n}", x, grouping = True)) # {:n} ; not a valid formatter ?
Похоже, locale.format("%g", ...)
ближе всего к тому, что я хочу, но, похоже, он не работает правильно:
print(locale.format("%g", 1000.01, grouping = True)) # 1,000.01 ; works but only for small numbers
print(locale.format("%g", 10000.01, grouping = True)) # 10,000 ; doesn't work, loses decimal
Также кажется, что форматер n
отсутствует в local.format
.
Есть идеи?Кажется действительно странным, что не существует общепринятого метода для этого, который я нашел по крайней мере до сих пор.