Как напечатать число с запятыми в качестве разделителей тысяч? - PullRequest
605 голосов
/ 01 декабря 2009

Я пытаюсь напечатать целое число в Python 2.6.1 с запятыми в качестве разделителей тысяч. Например, я хочу показать число 1234567 как 1,234,567. Как бы я поступил так? Я видел много примеров в Google, но я ищу самый простой практический способ.

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

Ответы [ 27 ]

8 голосов
/ 17 ноября 2010

От комментариев до рецепта activestate 498181 Я переработал это:

import re
def thous(x, sep=',', dot='.'):
    num, _, frac = str(x).partition(dot)
    num = re.sub(r'(\d{3})(?=\d)', r'\1'+sep, num[::-1])[::-1]
    if frac:
        num += dot + frac
    return num

Он использует функцию регулярных выражений: lookahead , т. Е. (?=\d), чтобы убедиться, что только группы из трех цифр, которые имеют цифру «после», получают запятую. Я говорю «после», потому что в этот момент строка обратная.

[::-1] просто переворачивает строку.

6 голосов
/ 01 июля 2017

Python 3

-

Целые числа (без десятичной дроби):

"{:,d}".format(1234567)

-

Число с плавающей запятой (с десятичной дробью):

"{:,.2f}".format(1234567)

где число перед f указывает количество десятичных знаков.

-

Бонус

Функция быстрого старта для индийской системы нумерации лаков / кроров (12,34,567):

https://stackoverflow.com/a/44832241/4928578

5 голосов
/ 09 ноября 2017

Хорошо принятый ответ, но на самом деле я предпочитаю format(number,','). Мне легче интерпретировать и запомнить.

https://docs.python.org/3/library/functions.html#format

4 голосов
/ 02 июля 2016

из Python версии 2.6 вы можете сделать это:

def format_builtin(n):
    return format(n, ',')

Для версий Python <2.6 и просто для вашей информации, вот 2 ручных решения: они превращают числа с плавающей точкой в ​​целые, но отрицательные числа работают правильно: </p>

def format_number_using_lists(number):
    string = '%d' % number
    result_list = list(string)
    indexes = range(len(string))
    for index in indexes[::-3][1:]:
        if result_list[index] != '-':
            result_list.insert(index+1, ',')
    return ''.join(result_list)

здесь стоит кое-что заметить:

  • эта строка: string = '% d'% number прекрасно преобразует число в строку, поддерживает негативы и отбрасывает дроби из чисел с плавающей точкой, делая их целыми;
  • этот фрагмент indexes [:: - 3] возвращает каждый третий элемент, начиная с конец, поэтому я использовал еще один фрагмент [1:] , чтобы удалить самый последний элемент Потому что мне не нужна запятая после последнего номера;
  • это условие , если l [index]! = '-' используется для поддержки отрицательных чисел, не вставляйте запятую после знака минус.

И более хардкорная версия:

def format_number_using_generators_and_list_comprehensions(number):
    string = '%d' % number
    generator = reversed( 
        [
            value+',' if (index!=0 and value!='-' and index%3==0) else value
            for index,value in enumerate(reversed(string))
        ]
    )
    return ''.join(generator)
1 голос
/ 06 ноября 2010

Вот тот, который работает и для поплавков:

def float2comma(f):
    s = str(abs(f)) # Convert to a string
    decimalposition = s.find(".") # Look for decimal point
    if decimalposition == -1:
        decimalposition = len(s) # If no decimal, then just work from the end
    out = "" 
    for i in range(decimalposition+1, len(s)): # do the decimal
        if not (i-decimalposition-1) % 3 and i-decimalposition-1: out = out+","
        out = out+s[i]      
    if len(out):
        out = "."+out # add the decimal point if necessary
    for i in range(decimalposition-1,-1,-1): # working backwards from decimal point
        if not (decimalposition-i-1) % 3 and decimalposition-i-1: out = ","+out
        out = s[i]+out      
    if f < 0:
        out = "-"+out
    return out

Пример использования:

>>> float2comma(10000.1111)
'10,000.111,1'
>>> float2comma(656565.122)
'656,565.122'
>>> float2comma(-656565.122)
'-656,565.122'
1 голос
/ 28 марта 2016

Я новичок в Python, но опытный программист. У меня есть Python 3.5, поэтому я могу просто использовать запятую, но это, тем не менее, интересное упражнение по программированию. Рассмотрим случай целого числа без знака. Наиболее читаемая программа Python для добавления разделителей тысяч выглядит так:

def add_commas(instr):
    out = [instr[0]]
    for i in range(1, len(instr)):
        if (len(instr) - i) % 3 == 0:
            out.append(',')
        out.append(instr[i])
    return ''.join(out)

Также возможно использовать понимание списка:

add_commas(instr):
    rng = reversed(range(1, len(instr) + (len(instr) - 1)//3 + 1))
    out = [',' if j%4 == 0 else instr[-(j - j//4)] for j in rng]
    return ''.join(out)

Это короче, и может быть одним вкладышем, но вам придется сделать несколько умственных упражнений, чтобы понять, почему это работает. В обоих случаях мы получаем:

for i in range(1, 11):
    instr = '1234567890'[:i]
    print(instr, add_commas(instr))
1 1
12 12
123 123
1234 1,234
12345 12,345
123456 123,456
1234567 1,234,567
12345678 12,345,678
123456789 123,456,789
1234567890 1,234,567,890

Первая версия - более разумный выбор, если вы хотите, чтобы программа была понятна.

1 голос
/ 24 января 2019

это запекается в python за PEP -> https://www.python.org/dev/peps/pep-0378/

просто используйте формат (1000, ', d'), чтобы показать целое число с разделителем тысяч

есть больше форматов, описанных в PEP, есть у него

1 голос
/ 04 июня 2013

Один вкладыш для Python 2.5+ и Python 3 (только положительный int):

''.join(reversed([x + (',' if i and not i % 3 else '') for i, x in enumerate(reversed(str(1234567)))]))
0 голосов
/ 01 декабря 2009

Просто подкласс long (или float, или что угодно). Это очень практично, потому что таким образом вы все равно можете использовать свои числа в математических операциях (и, следовательно, существующий код), но все они будут хорошо печататься в вашем терминале.

>>> class number(long):

        def __init__(self, value):
            self = value

        def __repr__(self):
            s = str(self)
            l = [x for x in s if x in '1234567890']
            for x in reversed(range(len(s)-1)[::3]):
                l.insert(-x, ',')
            l = ''.join(l[1:])
            return ('-'+l if self < 0 else l) 

>>> number(-100000)
-100,000
>>> number(-100)
-100
>>> number(-12345)
-12,345
>>> number(928374)
928,374
>>> 345
0 голосов
/ 22 февраля 2018

Итальянские числа: разделитель тысяч - это '.'

Я решил это таким образом ... для диктонары

from random import randint

voci = {
    "immobilizzazioni": randint(200000, 500000),
    "tfr": randint(10000, 25000),
    "ac": randint(150000, 200000),
    "fondo": randint(10500, 22350),
    "debiti": randint(150000, 250000),
    "ratei_attivi": randint(2000, 2500),
    "ratei_passivi": randint(1500, 2600),
    "crediti_v_soci": randint(10000, 30000)
}


testo_rnd2 = """Nell’azienda Hypermax S.p.a. di Bologna le immobilizzazioni valgono {immobilizzazioni:,} €, i debiti per TFR sono pari a {tfr:,} €, l’attivo circolante è di {ac:,} euro, il fondo rischi ed oneri ha un importo pari a {fondo:,} euro, i debiti sono {debiti:,} €, i ratei e risconti attivi sono pari a {ratei_attivi:,} euro, i ratei e risconti passivi sono pari a {ratei_passivi:,} euro. I crediti verso i soci sono pari a {crediti_v_soci:,} euro."""

print(testo_rnd2)

из: le immobilizzazioni valgono 419,168 €. я дебит за TFR sono pari 13.255 €. l’attivo circolante è di 195.443 евро. il fondo rischi ed oneri ha un importo pari 13,374 евро. я дебито соно 180,947 €. я оцениваю риск-сативу соно пари 2,271 евро. я оцениваю пассив сони пари 1,864 евро. I crediti verso и soci sono pari 17,630 евро.

...