在Python中,将整数格式化为表示数千个K的字符串以及数百万个M,并在逗号后留下几个数字的简单方法是什么?
我想将7436313显示为7.44M,将2345显示为2,34K。
是否有可用的%字符串格式化运算符?或者这只能通过在循环中实际除以1000并逐步构造结果字符串来完成?
答案 0 :(得分:43)
我认为没有内置功能可以做到这一点。你必须自己动手,例如:
def human_format(num):
magnitude = 0
while abs(num) >= 1000:
magnitude += 1
num /= 1000.0
# add more suffixes if you need them
return '%.2f%s' % (num, ['', 'K', 'M', 'G', 'T', 'P'][magnitude])
print('the answer is %s' % human_format(7436313)) # prints 'the answer is 7.44M'
答案 1 :(得分:15)
此版本不会受到之前答案中的错误的影响,其中999,999为您提供1000.0K。它也只允许3个有效数字并消除尾随0。
def human_format(num):
num = float('{:.3g}'.format(num))
magnitude = 0
while abs(num) >= 1000:
magnitude += 1
num /= 1000.0
return '{}{}'.format('{:f}'.format(num).rstrip('0').rstrip('.'), ['', 'K', 'M', 'B', 'T'][magnitude])
输出如下:
>>> human_format(999999)
'1M'
>>> human_format(999499)
'999K'
>>> human_format(9994)
'9.99K'
>>> human_format(9900)
'9.9K'
>>> human_format(6543165413)
'6.54B'
答案 2 :(得分:3)
我今天需要这个功能,为Python的用户刷新了接受的答案> = 3.6:
def human_format(num, precision=2, suffixes=['', 'K', 'M', 'G', 'T', 'P']):
m = sum([abs(num/1000.0**x) >= 1 for x in range(1, len(suffixes))])
return f'{num/1000.0**m:.{precision}f}{suffixes[m]}'
print('the answer is %s' % human_format(7454538)) # prints 'the answer is 7.45M'
编辑:根据评论,您可能希望更改为round(num/1000.0)
答案 3 :(得分:3)
可变精度且没有999999错误:
def human_format(num, round_to=2):
magnitude = 0
while abs(num) >= 1000:
magnitude += 1
num = round(num / 1000.0, round_to)
return '{:.{}f}{}'.format(round(num, round_to), round_to, ['', 'K', 'M', 'G', 'T', 'P'][magnitude])
答案 4 :(得分:2)
更多" math-y"解决方案是使用math.log
:
from math import log, floor
def human_format(number):
units = ['', 'K', 'M', 'G', 'T', 'P']
k = 1000.0
magnitude = int(floor(log(number, k)))
return '%.2f%s' % (number / k**magnitude, units[magnitude])
试验:
>>> human_format(123456)
'123.46K'
>>> human_format(123456789)
'123.46M'
>>> human_format(1234567890)
'1.23G'
答案 5 :(得分:0)
无字符串格式化运算符according to the docs。我从来没有听说过这样的事情,所以你可能不得不按照你的建议自己动手。
答案 6 :(得分:0)
我认为没有格式化运算符,但您可以简单地除以1000,直到结果在1到999之间,然后在逗号后使用2位数的格式字符串。在大多数情况下,Unit是单个字符(或者可能是一个小字符串),您可以将其存储在字符串或数组中,并在每次除法后迭代它。
答案 7 :(得分:0)
我不知道这样的任何内置功能,但这里有几个可能有用的列表线程:
http://coding.derkeiler.com/Archive/Python/comp.lang.python/2005-09/msg03327.html http://mail.python.org/pipermail/python-list/2008-August/503417.html
答案 8 :(得分:0)
我也有同样的需求。而且,如果有人涉及这个主题,我会找到一个lib来做到这一点:https://github.com/azaitsev/millify
希望它会有所帮助:)
答案 9 :(得分:0)
我对其他人展示的某些东西感到困惑,因此我编写了以下代码。舍入到第二个小数点,例如。 “ 235.6十亿”,但您可以通过将最后一行中的两个“ 100.0”替换为较大或较小的数字(例如ex)来更改舍入到小数点后一位。 '10 .0'舍入到小数点后一位,'1000.0'舍入到小数点后三位。同样,使用此代码,它总是将其实际值四舍五入。您可以根据需要更改此设置,方法是将“地板”替换为“天花板”或“圆形”。
#make the dictionary to store what to put after the result (ex. 'Billion'). You can go further with this then I did, or to wherever you wish.
#import the desired rounding mechanism. You will not need to do this for round.
from math import floor
magnitudeDict={0:'', 1:'Thousand', 2:'Million', 3:'Billion', 4:'Trillion', 5:'Quadrillion', 6:'Quintillion', 7:'Sextillion', 8:'Septillion', 9:'Octillion', 10:'Nonillion', 11:'Decillion'}
def simplify(num):
num=floor(num)
magnitude=0
while num>=1000.0:
magnitude+=1
num=num/1000.0
return(f'{floor(num*100.0)/100.0} {magnitudeDict[magnitude]}')
最后一行中的字符串前的'f'是让python知道您正在格式化它。运行print(simplify(34867123012.13))的结果是:
34.86 Billion
如果您有任何疑问,请告诉我! 谢谢, 安格斯
答案 10 :(得分:0)
Numerize 库很好。
from numerize import numerize
a = numerize.numerize(1000)
print(a)
1k
感谢@tdy 指出这一点,
a = numerize.numerize(999999)
print(a) # 1000K
1000K