python人类可读的大数字[重复]
Posted
技术标签:
【中文标题】python人类可读的大数字[重复]【英文标题】:python human readable large numbers [duplicate] 【发布时间】:2010-07-01 00:54:50 【问题描述】:是否有一个 python 库可以使这样的数字更具人类可读性
187,280,840,422,780 美元
已编辑:例如,我希望将其输出为 187 万亿,而不仅仅是逗号分隔。所以我希望产量达到数万亿、数百万、数十亿等
【问题讨论】:
安装 clisp 并写下这个:(format t "~r" (parse-integer (read-line *standard-input*)))
然后使用子进程调用clisp prettynum.cl 187,000,000,000,000
...虽然我只是问了一个替代***.com/questions/3158132/…
python-ballpark
似乎完全符合 OP 的要求。
查看millify
我使用带有一行代码millify(the_number, precision=2)
的millify包获得了我想要的效果(例如,11,232,222到11.23 M)。检查github.com/azaitsev/millify。
【参考方案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
【讨论】:
我可能应该指出,使用 Billion, Trillion 在欧洲大陆的含义与在美国的含义不同。甚至英国直到最近才采用美国公约。见en.wikipedia.org/wiki/Long_and_short_scales 结果应使用 SI 单位前缀表示,即千美元、兆美元、千兆美元等 :) @tzot LOL 但这是我可以习惯的。 不错!仅供参考,以上不适用于 0,但很容易对此进行检查 你应该使用“人性化”。见pypi.org/project/humanize【参考方案2】:在 Python2.7+ 或 v3 中,您只需在字符串格式中使用“,”选项 - 请参阅 PEP 378: Format Specifier for Thousands Separator 了解更多信息:
>>> ":,".format(100000000)
'100,000,000'
使用 Python3.6+,您还可以使用“_”格式 - 详情请参阅 PEP 515:
>>> ":_".format(100000000)
'100_000_000'
或者你可以使用similar syntax with f-strings:
>>> 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'
【讨论】:
':,'.format(x)
是什么语法?我可以尝试一下,看看它是否有效,但我之前没有见过这种语法,那么,它是如何工作的?
它在 PEP-0378 中:“',' 选项表明逗号应该作为千位分隔符包含在输出中。与不使用句点作为小数点的区域设置一样,区域设置使用不同的数字分隔约定将需要使用语言环境模块来获得适当的格式。”
谢谢莱斯特!
,
和 _
在格式说明符中的使用也被描述为in the documentation for the format mini-language。【参考方案3】:
这个数字对我来说似乎很容易读懂。不友好的号码是 187289840422780.00。要添加逗号,您可以创建自己的函数或搜索一个(我找到了this):
import re
def comma_me(amount):
orig = amount
new = re.sub("^(-?\d+)(\d3)", '\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】:来自here:
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
【讨论】:
【参考方案5】:如果“可读”是指“单词”;这是一个很好的解决方案,您可以适应。
http://www.andrew-hoyer.com/experiments/numbers
【讨论】:
以上是关于python人类可读的大数字[重复]的主要内容,如果未能解决你的问题,请参考以下文章
将 dict 保存为 JSON,以便它们是人类可读的 [重复]
如何以 json 格式(双引号)漂亮地打印(人类可读的打印)Python dict? [复制]
python 参数化pytest测试用例,包含参数字典和人类可读的测试用例名称