Проценты в формате Python - PullRequest
0 голосов
/ 17 июня 2019

Я использую следующий фрагмент для преобразования отношения в процентах:

"{:2.1f}%".format(value * 100)

Это работает, как и следовало ожидать.Я хочу расширить это, чтобы быть более информативным в крайних случаях, когда округленное отношение равно 0 или 1, но не совсем.

Есть ли более питонический способ, возможно, с использованием функции format, чтобы сделать это?В качестве альтернативы я бы добавил пункт, похожий на:

if math.isclose(value, 0) and value != 0:
    return "< 0.1"

Ответы [ 2 ]

2 голосов
/ 17 июня 2019

Предполагая, что Python 3.6+, маркировка с точностью до нуля или с точностью до 100% может быть сделана с помощью:

>>> for value in (0.0,0.0001,.9999,1.0):
...   f"{value:6.1%}{'*' if value == 0.0 or value == 1.0 else ' '}"
...
'  0.0%*'
'  0.0% '
'100.0% '
'100.0%*'
2 голосов
/ 17 июня 2019

Я бы порекомендовал запустить round, чтобы выяснить, будет ли форматирование строки округлять соотношение до 0 или 1. Эта функция также имеет возможность выбрать, сколько десятичных знаков округлять до:

def get_rounded(value, decimal=1):
    percent = value*100
    almost_one = (round(percent, decimal) == 100) and percent < 100
    almost_zero = (round(percent, decimal) == 0) and percent > 0
    if almost_one:
        return "< 100.0%"
    elif almost_zero:
        return "> 0.0%"
    else:
        return "{:2.{decimal}f}%".format(percent, decimal=decimal)

for val in [0, 0.0001, 0.001, 0.5, 0.999, 0.9999, 1]:
    print(get_rounded(val, 1))

Какие выходы:

0.0%
> 0.0%
0.1%
50.0%
99.9%
< 100.0%
100.0%

Я не верю, что есть более короткий способ сделать это. Я также не рекомендовал бы использовать math.isclose, так как вам пришлось бы использовать abs_tol, и он был бы не так удобочитаем.

...