Как настроить округление половинок вниз в формате f-строки? - PullRequest
1 голос
/ 11 марта 2020

Я пытаюсь изменить поведение моего кода следующим образом, ожидаемое поведение:

2249 -> 2.2
2250 -> 2.2
2251 -> 2.3
2349 -> 2.3
2350 -> 2.3
2351 -> 2.4

Но f'{num:.3g}' округляет его по-разному:

from decimal import *
def format_number(num):
  getcontext().prec = 1
  getcontext().rounding = ROUND_HALF_DOWN

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

format_number(2349)
2349
2350.0
'2.4k'

Как я могу заменить и оставить замену "thouthands to letter"?

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Я написал простой алгоритм, который помогает вам округлять числа с трейлингом 50. Я не тестировал его всесторонне, но он проходит все ваши случаи.

import math

def round100(x):
   return int(math.ceil((x-50.0)/100.0)) / 10.0

input = [2249, 2250, 2251, 2349, 2350, 2351]
for i in input:
   print(round100(i))
1 голос
/ 11 марта 2020

Вы можете изменить ширину точности вашего формата num как 2 вместо 3., что будет округлять цифры после ширины точности. поскольку вам, кажется, нужна точность только первых двух цифр, они округляют их, используя оставшиеся цифры.

from decimal import *


def format_number(num):
    getcontext().prec = 1
    getcontext().rounding = ROUND_HALF_DOWN

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


nums = [2249, 2250, 2251, 2349, 2350, 2351, 2349345, 2351345]
for num in nums:
    print(f"{num} -> {format_number(num)}")

OUTPUT

2249 -> 2.2k
2250 -> 2.2k
2251 -> 2.3k
2349 -> 2.3k
2350 -> 2.3k
2351 -> 2.4k
2349345 -> 2.3M
2351345 -> 2.4M
...