python 可读的大数字
有没有一个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