Метод с указанием локали для печати большого числа с запятыми и десятичными числами - PullRequest
0 голосов
/ 03 января 2019

Существует много устоявшихся ответов о том, как печатать числа с запятыми и / или десятичными знаками, примеры здесь , здесь , здесь и т. Д.

По какой-то причине я не могу найти четкий ответ о том, как сделать это для больших чисел с десятичными знаками с учетом локали, что не заставляет меня точно кодировать (например, при чтении файла и печатизначения из него, без предварительного знания того, насколько большими или точными будут цифры).

Чтобы все усложнить, я также надеюсь сделать это кросс-совместимым способом 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.

Есть идеи?Кажется действительно странным, что не существует общепринятого метода для этого, который я нашел по крайней мере до сих пор.

1 Ответ

0 голосов
/ 03 января 2019

Я имею в виду, вы могли бы разделить на десятичную точку и вычислить отдельно.Это может быть не идеально, но это работает.

# `input` is your number, `output` is the formatted string.
import locale #import
sep = '.' if locale.localeconv()['thousands_sep'] == ',' else ',' #get locale sep
parts = str(input).split(sep) #get part before and after the sep
parts[0] = locale.format("%d", parts[0], grouping=True) #format **part 0**
output = sep.join(parts) #rejoin

Я думаю, что это будет сделано.

Основная часть важности здесь - это вызов locale.localeconv()['thousands_sep'], который получает разделитель значений,Затем вы инвертируете его в той же строке, чтобы запятая стала точкой, и наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...