Форматирование длинных чисел как строк в python
Каким образом в Python можно форматировать целые числа в строки, представляющие тысячи с K, и миллионы с M, и оставляя только пару цифр после запятой?
Я бы хотел показать 7436313 как 7.44M, а 2345 - 2,34K.
Есть ли для этого какой-либо% -ный оператор форматирования строк? Или это можно сделать только путем фактического деления на 1000 в цикле и построения последовательности результатов шаг за шагом?
Ответы
Ответ 1
Я не думаю, что есть встроенная функция, которая делает это. Вам нужно будет свернуть самостоятельно, например:
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'
Ответ 2
Эта версия не страдает от ошибки в предыдущих ответах, где 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'
Ответ 3
Более "математическое решение" должно использовать 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'
Ответ 4
Нет оператора форматирования строк, в соответствии с документами. Я никогда не слышал об этом, поэтому, возможно, вам придется кататься самостоятельно, как вы полагаете.
Ответ 5
Я не думаю, что для этого есть операторы формата, но вы можете просто делить на 1000, пока результат не будет между 1 и 999, а затем используйте строку формата для 2 цифр после запятой. Единица - это единственный символ (или, может быть, небольшая строка) в большинстве случаев, который вы можете хранить в строке или массиве и прокручивать через него после каждого разделения.
Ответ 6
Я не знаю каких-либо встроенных возможностей, подобных этому, но вот несколько потоков списка, которые могут помочь:
http://coding.derkeiler.com/Archive/Python/comp.lang.python/2005-09/msg03327.html
http://mail.python.org/pipermail/python-list/2008-August/503417.html
Ответ 7
Мне нужна эта функция сегодня, обновленный принятый ответ немного для людей с 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)