2009-02-23 4 views
17

Что такое простой способ в Python форматировать целые числа в строки, представляющие тысячи с K, и миллионы с M, и оставляя только пару цифр после запятой?Форматирование длинных чисел в виде строк в python

Я бы хотел показать 7436313 как 7.44M, а 2345 - 2,34K.

Есть ли какой-нибудь% -ный оператор форматирования строк? Или это можно сделать только путем деления на 1000 в цикле и построения последовательности результатов шаг за шагом?

ответ

34

Я не думаю, что есть встроенная в функции, которая делает это. Вам придется свернуть свой собственный, например:

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' 
+0

999999 дисплеях 1000.00K, когда он должен сказать 1M. – rtaft

0

Нет Оператор форматирования строк, according to the docs. Я никогда не слышал об этом, поэтому, возможно, вам придется катиться самостоятельно.

0

Я не думаю, что для этого есть операторы формата, но вы можете просто делить на 1000, пока результат не будет между 1 и 999, а затем используйте строку формата для двух цифр после запятой. Единица - это единственный символ (или, может быть, небольшая строка) в большинстве случаев, который вы можете хранить в строке или массиве и перебирать через него после каждого разрыва.

0

мне нужна эта функция сегодня, обновилась принято отвечать немного для людей с 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' 

Edit: учитывая комментарии , вы можете изменить в round(num/1000.0)

+0

999999 отображает 1000.00K, когда он должен сказать 1M. – rtaft

1

более «математика-у» решение заключается в использовании 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' 
+0

999999 отображает 1000.00K, когда он должен сказать 1M. – rtaft

5

Эта версия не страдает от ошибки в предыдущих ответах, где 999999 дает вам 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' 
+0

это единственная версия, которая отлично работает для меня (без раздражающих трейлинг-столов) –

Смежные вопросы