Я пытаюсь напечатать целое число в Python 2.6.1 с запятыми в качестве разделителей тысяч. Например, я хочу показать номер 1234567
как 1,234,567
. Как бы я поступил так? Я видел много примеров в Google, но я ищу самый простой практический способ.
Он не должен зависеть от локали, чтобы выбирать между точками и запятыми. Я бы предпочел что-то настолько простое, насколько это возможно.
python
number-formatting
Элиас Замария
источник
источник
{val:,}.format(val=val)
f"{2 ** 64 - 1:,}"
Я получил это на работу:
Конечно, вам не нужна поддержка интернационализации, но она понятна, лаконична и использует встроенную библиотеку.
PS Это "% d" - обычный форматер в стиле%. У вас может быть только один форматер, но он может быть любым с точки зрения ширины поля и настроек точности.
PPS Если вы не можете приступить
locale
к работе, я бы предложил модифицированную версию ответа Марка:Рекурсия полезна для отрицательного случая, но одна рекурсия на запятую мне кажется немного чрезмерной.
источник
locale
, я использую как можно меньше.setlocale
использования значения по умолчанию, которое, мы надеемся, будет уместным.По неэффективности и нечитаемости трудно победить:
источник
lambda x: (lambda s: ','.join(["%s%s%s" % (x[0], x[1] or '', x[2] or '') for x in itertools.izip_longest(s[::-1][::3], s[::-1][1::3], s[::-1][2::3])])[::-1].replace('-,','-'))(str(x))
просто оставить тему запутывания.Вот код группирования локали после удаления ненужных частей и небольшой очистки:
(Следующее работает только для целых чисел)
Здесь уже есть несколько хороших ответов. Я просто хочу добавить это для дальнейшего использования. В Python 2.7 будет указатель формата для разделителя тысяч. В соответствии с документами Python это работает так
В python3.1 вы можете сделать то же самое, как это:
источник
Я удивлен, что никто не упомянул, что вы можете сделать это с помощью f-строк в Python 3.6 так просто:
... где часть после двоеточия является спецификатором формата. Запятая - это требуемый символ-разделитель, поэтому
f"{num:_}"
вместо запятой используются подчеркивания.Это эквивалентно использованию
format(num, ",")
для более старых версий Python 3.источник
Вот замена регулярного выражения в одну строку:
Работает только для интегральных выходов:
Или для чисел с плавающей запятой менее 4 цифр измените спецификатор формата на
%.3f
:NB: некорректно работает с более чем тремя десятичными цифрами, так как он пытается сгруппировать десятичную часть:
Как это работает
Давайте разберемся с этим:
источник
Это то, что я делаю для поплавков. Хотя, если честно, я не уверен, для каких версий он работает - я использую 2.7:
Возвращает: 4 385 893,38
Обновление: у меня недавно была проблема с этим форматом (не могу сказать вам точную причину), но я смог ее исправить, опустив
0
:источник
Вы также можете использовать
'{:n}'.format( value )
для языкового представления. Я думаю, что это самый простой способ решения локали.Для получения дополнительной информации ищите
thousands
в Python DOC .Для валюты вы можете использовать
locale.currency
, установив флагgrouping
:Код
Вывод
источник
Немного расширив ответ Яна Шнайдера:
Если вы хотите использовать пользовательский разделитель тысяч, самое простое решение:
Примеры
Если вы хотите, чтобы немецкое представление было таким, оно становится немного сложнее:
источник
'{:_.2f}'.format(12345.6789).replace('.', ',').replace('_', '.')
Я уверен, что для этого должна быть стандартная библиотечная функция, но было интересно попробовать написать ее самостоятельно, используя рекурсию, так что вот что я придумал:
Сказав это, если кто-то другой найдет стандартный способ сделать это, вы должны использовать его вместо этого.
источник
Из комментариев к рецепту activestate 498181 я переработал это:
Он использует функцию регулярных выражений: lookahead, т.е.
(?=\d)
чтобы убедиться, что только группы из трех цифр, у которых есть цифра «после», получат запятую. Я говорю «после», потому что в этот момент строка обратная.[::-1]
просто переворачивает строкуисточник
Принятый ответ - хорошо, но я на самом деле предпочитаю
format(number,',')
. Мне легче интерпретировать и запомнить.https://docs.python.org/3/library/functions.html#format
источник
Python 3
-
Целые числа (без десятичной дроби):
"{:,d}".format(1234567)
-
Поплавки (с десятичной дробью):
"{:,.2f}".format(1234567)
где число перед
f
указанием количества десятичных знаков.-
бонус
Функция быстрого и грязного стартера для индийской системы нумерации лакхов / кроров (12,34,567):
https://stackoverflow.com/a/44832241/4928578
источник
из Python версии 2.6 вы можете сделать это:
Для версий Python <2.6 и просто для вашей информации, вот 2 ручных решения, они превращают числа с плавающей точкой в целые, но отрицательные числа работают правильно:
Несколько вещей, чтобы заметить здесь:
И более хардкорная версия:
источник
Я новичок в Python, но опытный программист. У меня есть Python 3.5, так что я могу просто использовать запятую, но это, тем не менее, интересное упражнение по программированию. Рассмотрим случай целого числа без знака. Наиболее читаемая программа Python для добавления тысяч разделителей выглядит так:
Также возможно использовать понимание списка:
Это короче, и может быть одним вкладышем, но вам придется сделать некоторую умственную гимнастику, чтобы понять, почему это работает. В обоих случаях мы получаем:
Первая версия - более разумный выбор, если вы хотите, чтобы программа была понятна.
источник
Вот тот, который работает и для поплавков:
Пример использования:
источник
float2comma(12031023.1323)
возвращает: '12, 031,023.132,3 'Один вкладыш для Python 2.5+ и Python 3 (только положительный int):
источник
Универсальное решение
Я обнаружил некоторые проблемы с разделителем точек в предыдущих ответах. Я разработал универсальное решение, в котором вы можете использовать все, что захотите, в качестве разделителя тысяч без изменения локали . Я знаю, что это не самое элегантное решение, но оно выполняет свою работу. Не стесняйтесь улучшать это!
источник
Это делает деньги вместе с запятыми
источник
У меня есть Python 2 и Python 3 версии этого кода. Я знаю, что вопрос был задан для python 2, но теперь (спустя 8 лет) люди, вероятно, будут использовать python 3.
Код Python 3:
Код Python 2: (Изменить. Код Python 2 не работает. Я думаю, что синтаксис другой).
источник
Я использую Python 2.5, поэтому у меня нет доступа к встроенному форматированию.
Я посмотрел на intcomma кода Django (intcomma_recurs в приведенном ниже коде) и понял, что он неэффективен, потому что он рекурсивный, а также компиляция регулярного выражения при каждом запуске также не очень хорошая вещь. Это не является обязательным «вопросом», поскольку django на самом деле НЕ ТОЧНО сосредоточен на такого рода низкоуровневой производительности. Кроме того, я ожидал разницы в производительности в 10 раз, но она только в 3 раза медленнее.
Из любопытства я реализовал несколько версий intcomma, чтобы увидеть преимущества производительности при использовании регулярных выражений. Мои данные испытаний показывают небольшое преимущество для этой задачи, но на удивление совсем немного.
Мне также было приятно увидеть то, что я подозревал: использование подхода обратного пересчета не требуется в случае без регулярных выражений, но он действительно немного улучшает внешний вид кода за счет производительности ~ 10%.
Кроме того, я предполагаю, что вы передаете строку и выглядит как число. Результаты не определены иначе.
И вот результаты теста:
источник
это запекается в python для каждого PEP -> https://www.python.org/dev/peps/pep-0378/
просто используйте формат (1000, ', d'), чтобы показать целое число с разделителем тысяч
Есть больше форматов, описанных в PEP, есть у него
источник
Вот еще один вариант, использующий функцию генератора, которая работает для целых чисел:
И вот тест:
источник
Просто подкласс
long
(илиfloat
, или как угодно). Это очень практично, потому что таким образом вы все равно можете использовать свои числа в математических операциях (и, следовательно, существующий код), но все они будут хорошо печататься в вашем терминале.источник
__repr__()
правильный ли метод для переопределения? Я бы предложил переопределить__str__()
и оставить в__repr__()
покое, потому чтоint(repr(number(928374)))
должно работать, ноint()
запятыми будет.number(repr(number(928374)))
это не работает, нетint(repr(number(928374)))
. Тем неprint
менее , чтобы заставить этот подход работать напрямую , как и требовал OP,__str__()
метод должен быть переопределен, а не__repr__()
. В любом случае, в логике вставки запятой ядра есть ошибка.Италия:
источник
Для поплавков:
Для целых:
источник
float('1,234.52'.translate(None, ','))
может быть более простым и, возможно, быстрее.