Параметр ',' указывает на использование запятой в качестве разделителя тысяч. Для разделителя с учетом локали используйте вместо этого '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.
Конечно, вам не нужна поддержка интернационализации, но это понятно, лаконично и использует встроенную библиотеку.
P.S. Этот "% d" - обычный форматировщик в стиле %. У вас может быть только один форматировщик, но он может быть любым, что вам нужно с точки зрения ширины поля и настроек точности.
P.P.S. Если вы не можете приступить locale к работе, я бы предложил измененную версию ответа Марка:
defintWithCommas(x): iftype(x) notin [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('-,','-')