将长数字格式化为字符串

在 Python 中,有什么简单的方法可以将整数格式化为字符串,用 K 表示数千个,用 M 表示数百万个,逗号后只留下几位数字?

我想将7436313显示为7.44 M,2345显示为2.34 K。

是否有一些% string 格式化操作符可用?或者只能通过在循环中实际除以1000并逐步构造结果字符串来实现?

47378 次浏览

没有字符串格式化运算符,根据文件记录。我从来没有听说过这样的事情,所以你可能不得不卷自己的,因为你建议。

我不认为有这样的格式运算符,但你可以简单地除以1000,直到结果在1和999之间,然后使用一个格式字符串2位后逗号。在大多数情况下,Unit 是一个单个字符(或者可能是一个小字符串) ,您可以将其存储在字符串或数组中,并在每次除法之后迭代它。

我不知道是否有这样的内置功能,但是这里有几个列表线程可能会有所帮助:

Http://coding.derkeiler.com/archive/python/comp.lang.python/2005-09/msg03327.html Http://mail.python.org/pipermail/python-list/2008-august/503417.html

我不认为有一个内置的函数可以做到这一点,你必须自己滚动,例如:

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'

我今天就需要这个函数,为 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)

一个更“数学”的解决方案是使用 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'

这个版本不会受到前面答案中999,999给你1000.0 K 的错误的影响。它也只允许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'

可变精度和无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])

我也有同样的需求。如果有人想谈论这个话题,我找到了一个自由的方法: https://github.com/azaitsev/millify

希望对你有所帮助:)

我对其他人展示的一些东西感到有点困惑,所以我编写了下面的代码。它四舍五入到第二个小数点,例如。‘235.6 Billion’,但是您可以将最后一行中的两个‘100.0’替换为较大或较小的数字,比如‘235.6 Billion’从10.0舍入到一个小数点,从1000.0舍入到三个小数点。而且,使用这段代码,它总是从实际情况四舍五入。如果你愿意,你可以改变这一点,用“ ceil”或“ round”代替“ floor”。

#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 (简化(34867123012.13))的结果是:

34.86 Billion

如果你有问题,请告诉我! 谢谢, 安格斯

数字化 库是好的。

from numerize import numerize
a = numerize.numerize(1000)
print(a)
1k

谢谢你指着我,

a = numerize.numerize(999999)
print(a)  # 1000K
1000K

基于这里的注释,我为此编写了一个改进的代码。它稍微长一点,但是给出了包括小数(m,u,n,p)在内的更多情况下的解。

希望对某些人有所帮助

# 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')
def 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])