Как отформатировать числа в виде строк (1k, 2M ...) без округления в python? - PullRequest
2 голосов
/ 02 марта 2020

Я пытаюсь округлить пол до int или 1 decimal для ненулевого float с буквами k, M, B....

def human_format(num):
  num = float(f'{num:.3g}')
  magnitude = 0
  while abs(num) >= 1000:
    magnitude += 1
    num /= 1000.0
  num = int(num * 10) / 10
  return f"{f'{num:f}'.rstrip('0').rstrip('.')}{['', 'k', 'M', 'B', 'T'][magnitude]}"

Теперь эта функция возвращается, как и ожидалось в этом случае :

human_format(1294)
'1.2k'

И округляется в следующем случае:

human_format(1295)
'1.3k'

Округление происходит из-за флага g в строковом формате, и я не знаю, как его настроить , Как я могу избежать округления, оставляя все остальное таким же?

1 Ответ

2 голосов
/ 02 марта 2020

Вы можете использовать десятичное число для округления начального значения num:

from decimal import *

def human_format(num):
    # set decimal default options!
    getcontext().prec = 1
    getcontext().rounding = ROUND_DOWN

    _num = Decimal(num)
    num = float(f'{_num:.3g}')
    magnitude = 0
    while abs(num) >= 1000:
        magnitude += 1
        num /= 1000.0
    num = int(num * 10) / 10
    return f"{f'{num:f}'.rstrip('0').rstrip('.')}{['', 'k', 'M', 'B', 'T'][magnitude]}"


for x in range(1293, 1301):
    print('%s >> %s' % (x, human_format(x)))

Выход:

1293 >> 1.2k
1294 >> 1.2k
1295 >> 1.2k
1296 >> 1.2k
1297 >> 1.2k
1298 >> 1.2k
1299 >> 1.2k
1300 >> 1.3k
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...