如何使用Python简单地将整数格式化成以K表示千位,以M表示百万位,并在逗号后只保留几个数字的字符串?
例如,我希望把7436313显示为7.44M,而把2345显示为2.34K。
是否有可用于此目的的%格式化操作符?或者这只能通过循环除以1000并逐步构建结果字符串来实现?
如何使用Python简单地将整数格式化成以K表示千位,以M表示百万位,并在逗号后只保留几个数字的字符串?
例如,我希望把7436313显示为7.44M,而把2345显示为2.34K。
是否有可用于此目的的%格式化操作符?或者这只能通过循环除以1000并逐步构建结果字符串来实现?
这个版本不会出现之前答案中的错误,即 999,999 显示为 1000.0K。同时,它只允许三个有效数字,并消除了末尾的 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'
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'
long_nr=1_000_000
而不是1000000
,Python 不会将 _
视为计算符号。 - Timo一种更"数学化"的解决方案是使用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'
magnitude = int(floor(log(abs(number), k)))
- benlevmagnitude = int(math.floor(math.log(max(abs(number), 1), k)))
- benlev变量精度和没有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(num, round_to, ['', 'K', 'M', 'G', 'T', 'P'][magnitude])
num
替换 round(num, round_to)
,因为此时它已经被四舍五入了。 - tdy我今天需要这个函数,稍微更新了已接受的答案,以适应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)
m = int(math.log10(num) // 3)
- Nimrod MoragNumerize 库很好。
from numerize import numerize
a = numerize.numerize(1000)
print(a)
1k
a = numerize.numerize(999999)
print(a) # 1000K
1000K
#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
如果您有任何问题,请告诉我! 谢谢, 安格斯
# print number in a readable format.
# default is up to 3 decimal digits and can be changed
# works on numbers in the range of 1e-15 to 1e 1e15 include negatives numbers
# can force the number to a specific magnitude unit
def human_format(num:float, force=None, ndigits=3):
perfixes = ('p', 'n', 'u', 'm', '', 'K', 'M', 'G', 'T')
one_index = perfixes.index('')
if force:
if force in perfixes:
index = perfixes.index(force)
magnitude = 3*(index - one_index)
num = num/(10**magnitude)
else:
raise ValueError('force value not supported.')
else:
div_sum = 0
if(abs(num) >= 1000):
while abs(num) >= 1000:
div_sum += 1
num /= 1000
else:
while abs(num) <= 1:
div_sum -= 1
num *= 1000
temp = round(num, ndigits) if ndigits else num
if temp < 1000:
num = temp
else:
num = 1
div_sum += 1
index = one_index + div_sum
return str(num).rstrip('0').rstrip('.') + perfixes[index]
从这里开始的测试和更多测试
# some tests
print(human_format(999) ,' = ' , '999')
print(human_format(999.999) ,' = ' , '999.999')
print(human_format(999.9999) ,' = ' , '1K')
print(human_format(999999) ,' = ' , '999.999K')
print(human_format(999499) ,' = ' , '999.499K')
print(human_format(9994) ,' = ' , '9.994K')
print(human_format(9900) ,' = ' , '9.9K')
print(human_format(6543165413) ,' = ' , '6.543G')
print(human_format(46780.9) ,' = ' , '46.781K')
print(human_format(0.001) ,' = ' , '1m')
print(human_format(0.000000999999) ,' = ' , '999.999n')
print(human_format(1.00394200) ,' = ' , '1.004')
print(human_format(0.0999) ,' = ' , '99.9m')
print(human_format(0.00000000999999) ,' = ' , '10n')
print(human_format(0.0000000099995) ,' = ' , '9.999n')
print(human_format(0.000000009999) ,' = ' , '9.999n')
print(human_format(999999 ,ndigits=2) ,' = ' , '1M')
print(human_format(9994 ,force='') ,' = ' , '9994K')
print(human_format(6543165413 ,ndigits=5) ,' = ' , '6.54317G')
print(human_format(6543165413 ,ndigits=None) ,' = ' , '6.543165413G')
print(human_format(7436313 ,ndigits=2) ,' = ' , '7.44M')
print(human_format(2344 ,ndigits=2) ,' = ' , '2.34K')
print(human_format(34867123012.13 ,ndigits=2) ,' = ' , '34.87G')
if force:
,当使用 ''
时会被评估为 false。 - rtaftdef human_format(value):
num = value
magnitude = 0
while abs(num) >= 1000:
magnitude += 1
num /= 1000.0
result = round(value / (1000**magnitude),3)
return '{}{}'.format(result, ['', 'K', 'M', 'B', 'T'][magnitude])
'9_9K'
而不是'9.9K'
,该怎么办? - AleB