Python человекочитаемые большие числа

есть ли библиотека python, которая сделала бы такие числа, такие как более читаемые человеком

$187.280.840.422.780

отредактирован: например, iw ant вывод этого будет 187 триллионов, а не только разделенным запятой. Поэтому я хочу, чтобы результат был триллионами, миллионами, миллиардами и т.д.

Ответ 1

Насколько я понимаю, вам нужна только "самая значимая" часть. Для этого используйте floor(log10(abs(n))) чтобы получить количество цифр, а затем перейдите оттуда. Примерно так, может быть:

import math

millnames = ['',' Thousand',' Million',' Billion',' Trillion']

def millify(n):
    n = float(n)
    millidx = max(0,min(len(millnames)-1,
                        int(math.floor(0 if n == 0 else math.log10(abs(n))/3))))

    return '{:.0f}{}'.format(n / 10**(3 * millidx), millnames[millidx])

Запуск вышеуказанной функции для нескольких разных номеров:

for n in (1.23456789 * 10**r for r in range(-2, 19, 1)):
    print('%20.1f: %20s' % (n,millify(n)))
                 0.0:                    0
                 0.1:                    0
                 1.2:                    1
                12.3:                   12
               123.5:                  123
              1234.6:           1 Thousand
             12345.7:          12 Thousand
            123456.8:         123 Thousand
           1234567.9:            1 Million
          12345678.9:           12 Million
         123456789.0:          123 Million
        1234567890.0:            1 Billion
       12345678900.0:           12 Billion
      123456789000.0:          123 Billion
     1234567890000.0:           1 Trillion
    12345678900000.0:          12 Trillion
   123456789000000.0:         123 Trillion
  1234567890000000.0:        1235 Trillion
 12345678899999998.0:       12346 Trillion
123456788999999984.0:      123457 Trillion
1234567890000000000.0:     1234568 Trillion

Ответ 2

(Изменение: Не могу поверить, что я обновляю свой ответ в 2019 году! Это доказывает, что следующая фраза эволюции человека - это обмен знаниями через Интернет!)

В Python2. 7+ или v3 вы просто используете опцию "," при форматировании строки:

human_readable_number = "{:,}".format(100000000)

См. PEP 378: Спецификатор формата для разделителя тысяч для получения дополнительной информации:

http://www.python.org/dev/peps/pep-0378/

Добавлено в 2014: В эти дни у меня есть следующая функция оболочки:

human_readable_numbers () {
    python2.7 -c "print('{:,}').format($1)"
}

Так что мне не нужно прищуриться на большие цифры.

Остановитесь здесь, если вам не повезло работать с кодом до 2.7 или средой в 2019 году...

Вы также можете сделать это с помощью локали:

import locale
locale.setlocale(locale.LC_ALL, 'en_US')
locale.format('%d', 2**32, grouping=True)   # returns '4,294,967,296'

Надеюсь это поможет!

Ответ 3

Это число кажется мне понятным для человека. Недружественным номером будет 187289840422780.00. Чтобы добавить запятые, вы можете создать свою собственную функцию или найти ее (я нашел this):

import re

def comma_me(amount):
    orig = amount
    new = re.sub("^(-?\d+)(\d{3})", '\g<1>,\g<2>', amount)
    if orig == new:
        return new
    else:
        return comma_me(new)

f = 12345678
print comma_me(`f`)
Output: 12,345,678

Если вы хотите округлить число, чтобы сделать его более читаемым, для него есть функция python: round().

Вы можете отодвинуться еще дальше от фактических данных и сказать "Очень высокая сумма" или "Выше 100 триллионов", используя функцию, которая вернет другое значение, основанное на ваших запрограммированных тестах.

Ответ 4

Из здесь:

def commify(n):
    if n is None: return None
    if type(n) is StringType:
        sepdec = localenv['mon_decimal_point']
    else:
        #if n is python float number we use everytime the dot
        sepdec = '.'
    n = str(n)
    if sepdec in n:
        dollars, cents = n.split(sepdec)
    else:
        dollars, cents = n, None

    r = []
    for i, c in enumerate(reversed(str(dollars))):
        if i and (not (i % 3)):
            r.insert(0, localenv['mon_thousands_sep'])
        r.insert(0, c)
    out = ''.join(r)
    if cents:
        out += localenv['mon_decimal_point'] + cents
    return out