63

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

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

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

4

11 回答 11

86

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

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'
于 2009-02-23T21:11:36.167 回答
74

此版本不受先前答案中的错误的影响,即 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'
于 2017-08-23T18:18:42.130 回答
11

一个更“数学”的解决方案是使用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'
于 2017-08-03T08:17:20.970 回答
7

可变精度并且没有 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])
于 2018-04-21T12:09:23.060 回答
6

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

于 2017-04-24T12:12:07.167 回答
2

我对其他人展示的一些东西有点困惑,所以我做了下面的代码。它四舍五入到第二个小数点,例如。'235.6 亿',但您可以通过将最后一行中的两个 '100.0' 替换为更大或更小的数字来更改它的小数位数,例如。“10.0”四舍五入到小数点后一位,“1000.0”四舍五入到小数点后三位。此外,使用此代码,它总是从实际值向下取整。您可以根据需要更改此设置,将 'floor' 替换为 'ceil' 或 'round'。

#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

如果您有任何问题,请告诉我!谢谢,安格斯

于 2020-12-05T03:12:35.283 回答
1

我也有同样的需要。如果有人谈到这个话题,我找到了一个这样做的库:https ://github.com/azaitsev/millify

希望能帮助到你 :)

于 2020-01-14T16:01:26.743 回答
1

Numerize库很好。

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

感谢@tdy 指出这一点,

a = numerize.numerize(999999) 
print(a)  # 1000K 
1000K
于 2021-07-20T11:59:15.657 回答
0

根据文档,没有字符串格式运算符。我从来没有听说过这样的事情,所以你可能不得不按照你的建议自己动手。

于 2009-02-23T21:02:49.247 回答
0

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

于 2009-02-23T21:05:36.853 回答
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

于 2009-02-23T21:10:45.420 回答