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

use*_*503 27 python string formatting integer

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

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

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

Ada*_*eld 46

我认为没有内置功能可以做到这一点.你必须自己动手,例如:

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'
Run Code Online (Sandbox Code Playgroud)

  • 999999 应该显示 1M 时显示 1000.00K。 (5认同)
  • 你可以在编辑器中写“long_nr=1_000_000”而不是“1000000”,python不会考虑“_”。 (2认同)

rta*_*aft 21

这个版本没有遭遇以前的答案中的错误,其中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])
Run Code Online (Sandbox Code Playgroud)

输出如下:

>>> human_format(999999)
'1M'
>>> human_format(999499)
'999K'
>>> human_format(9994)
'9.99K'
>>> human_format(9900)
'9.9K'
>>> human_format(6543165413)
'6.54B'
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一最适合我的版本(没有令人讨厌的尾随0) (2认同)

小智 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])
Run Code Online (Sandbox Code Playgroud)

测试:

>>> human_format(123456)
'123.46K'
>>> human_format(123456789)
'123.46M'
>>> human_format(1234567890)
'1.23G'
Run Code Online (Sandbox Code Playgroud)

  • 999999 应该显示 1M,但显示 1000.00K。 (4认同)

Roe*_*ant 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'
Run Code Online (Sandbox Code Playgroud)

编辑:鉴于评论,您可能想要更改为 round(num/1000.0)

  • 999999 应该显示 1M,但显示 1000.00K。 (2认同)

mic*_*iam 6

可变精度且没有 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])
Run Code Online (Sandbox Code Playgroud)

  • 在最后一行的格式字符串中,我认为您可以将“round(num, round_to)”替换为“num”,因为它已经被舍入到该点。 (2认同)

Joh*_*wyn 5

数字图书馆很好。

from numerize import numerize
a = numerize.numerize(1000)
print(a)
1k
Run Code Online (Sandbox Code Playgroud)

感谢@tdy 指出这一点,

a = numerize.numerize(999999) 
print(a)  # 1000K 
1000K
Run Code Online (Sandbox Code Playgroud)