Вопрос-Ответ

How to print a number using commas as thousands separators

Как напечатать число, используя запятые в качестве разделителей тысяч

Как мне напечатать целое число с запятыми в качестве разделителей тысяч?

12345671,234,567

Для выбора между точками и запятыми не обязательно зависеть от локали.

Переведено автоматически
Ответ 1

Не зависит от локали: используйте _ в качестве разделителя тысяч

f'{value:_}'          # For Python ≥3.6

Английский стиль: используйте , в качестве разделителя тысяч

'{:,}'.format(value)  # For Python ≥2.7
f'{value:,}' # For Python ≥3.6

С учетом локали

import locale
locale.setlocale(locale.LC_ALL, '') # Use '' for auto, or force e.g. to 'en_US.UTF-8'

'{:n}'.format(value) # For Python ≥2.7
f'{value:n}' # For Python ≥3.6

Ссылка

Согласно спецификации формата Мини-языка,


Параметр ',' указывает на использование запятой в качестве разделителя тысяч. Для разделителя с учетом локали используйте вместо этого 'n' тип представления integer .


и:


'_' Опция сигнализирует об использовании символа подчеркивания для разделителя тысяч для типов представления с плавающей запятой и для целочисленного типа представления 'd'. Для целочисленных типов представления 'b', 'o', 'x' и 'X' символы подчеркивания будут вставляться через каждые 4 цифры.


Ответ 2

Я удивлен, что никто не упомянул, что вы можете сделать это с помощью f-строк в Python 3.6+ так просто, как это:

>>> num = 10000000
>>> print(f"{num:,}")
10,000,000

... где часть после двоеточия является определителем формата. Запятая - это нужный вам символ-разделитель, поэтому f"{num:_}" вместо запятой используются символы подчеркивания. С этим методом можно использовать только "," и "_".

Это эквивалентно использованию format(num, ",") для более старых версий python 3.

Это может показаться волшебством, когда вы видите это в первый раз, но это не так. Это просто часть языка, и обычно достаточно того, что позволяет иметь ярлык. Чтобы узнать больше об этом, взгляните на подкомпонент group.

Ответ 3

Я заставил это работать:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'en_US')
'en_US'
>>> locale.format_string("%d", 1255000, grouping=True)
'1,255,000'

Конечно, вам не нужна поддержка интернационализации, но это понятно, лаконично и использует встроенную библиотеку.

P.S. Этот "% d" - обычный форматировщик в стиле %. У вас может быть только один форматировщик, но он может быть любым, что вам нужно с точки зрения ширины поля и настроек точности.

P.P.S. Если вы не можете приступить locale к работе, я бы предложил измененную версию ответа Марка:

def intWithCommas(x):
if type(x) not in [type(0), type(0L)]:
raise TypeError("Parameter must be an integer.")
if x < 0:
return '-' + intWithCommas(-x)
result = ''
while x >= 1000:
x, r = divmod(x, 1000)
result = ",%03d%s" % (r, result)
return "%d%s" % (x, result)

Рекурсия полезна для отрицательного регистра, но одна рекурсия на запятую кажется мне немного чрезмерной.

P.P.P.S. Старые Pythons использовали format вместо format_string.

Ответ 4

По неэффективности и нечитабельности его трудно превзойти:

>>> import itertools
>>> s = '-1234567'
>>> ','.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('-,','-')
2023-09-08 11:30 python