在python中将长数字格式化为字符串

时间:2009-02-23 20:55:58

标签: python formatting string integer

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

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

是否有可用的%字符串格式化运算符?或者这只能通过在循环中实际除以1000并逐步构造结果字符串来完成?

11 个答案:

答案 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)

答案 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