python 可读的大数字

59 投票
5 回答
89950 浏览
提问于 2025-04-16 00:39

有没有一个Python库可以把像这样的数字变得更容易理解呢?

$187,280,840,422,780

补充一下:比如我想要的输出是187万亿,而不仅仅是用逗号分隔的数字。所以我希望输出能显示成万亿、百万、十亿等等。

5 个回答

4

这个数字看起来对我来说挺容易理解的。一个不太友好的数字可能是187289840422780.00。要给数字加上逗号,你可以自己写一个函数,或者找一个现成的(我找到过这个):

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万亿”,这样可以用一个函数,根据你设定的标准返回不同的值。

80

注意,这个问题随着时间的推移已经发生了变化。如果你想了解“人类可读”的数字格式,可以看看Janus的回答,或者如果你只是想把数字格式化成带分隔符的字符串,可以继续往下读。

在Python 2.7及以上版本或者Python 3中,你只需要在字符串格式化时使用“,”选项。想了解更多信息,可以查看PEP 378:千位分隔符的格式说明

>>> "{:,}".format(100000000)
'100,000,000'

在Python 3.6及以上版本中,你还可以使用“_”格式。详细信息可以参考PEP 515

>>> "{:_}".format(100000000)
'100_000_000'

或者你可以使用类似的f-string语法

>>> number = 100000000
>>>f"{number:,}"
'100,000,000'

为了让我在阅读大数字时不需要眯着眼睛,我把2.7版本的代码封装成了一个shell函数:

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

最后,如果你因为某种原因必须使用Python 2.6或更早版本的代码,你可以通过使用locale标准库模块来解决这个问题:

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

根据我的理解,你只想要“最重要”的部分。要做到这一点,可以使用 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

撰写回答