синтаксис форматной строки: процент печати с хотя бы одной значащей цифрой - PullRequest
3 голосов
/ 27 февраля 2012

Я хочу отформатировать число в процентах, по крайней мере, с 2 цифрами после десятичной точки; и, кроме того, хотя бы с одной значащей цифрой.

Например, я хочу, чтобы 0.123456 выглядел как '12 .34%'; и 0,00000123456, чтобы выглядеть как «0,0001%».

Есть ли простой способ добиться этого?

Причина в том, что мой стандартный вывод должен быть числом с фиксированной запятой с двумя десятичными знаками после запятой; но если число настолько мало, что выглядит как 0,00%, мне нужно показать хотя бы одну значащую цифру, чтобы ее можно было отличить от истинного 0.

Ответы [ 2 ]

9 голосов
/ 27 февраля 2012
import math

def format_percent(x, at_least=2):
    return '{1:.{0}%}'.format(max(at_least, int(-math.log10(x))-1), x)


for x in (1., .1, .123456, .0123, .00123, .000123, .0000123, .00000123):
    print x, format_percent(x, 2)


1.0 100.00%
0.1 10.00%
0.123456 12.35%
0.0123 1.23%
0.00123 0.12%
0.000123 0.01%
1.23e-05 0.001%
1.23e-06 0.0001%

Больше случаев с разными at_least:

>>> format_percent(.1, 3)
'10.000%'

>>> format_percent(.012345678, 5)
'1.23457%'

>>> format_percent(.000123, 0)
'0.01%'

>>> format_percent(1.23456, 0)
'123%'
2 голосов
/ 02 апреля 2012

Если вы оберните процент в классе, вы можете делать что-то в его методе format и все равно использовать его для обычных вычислений.Вы также можете проанализировать аргумент в формат (часть между: и} в '{1: 3}', чтобы переопределить значение at_least:

import sys
import math

class Percentage(float):
    _at_least = 2
    def __init__(self, val):
        self._x = val

    def __format__(self, s):
        #print 's [%s]' % (repr(s))
        at_least = Percentage._at_least
        try:
            at_least = int(s)
        except:
            pass
        return '{1:.{0}%}'.format(max(at_least, int(-math.log10(self._x))-1), 
                                  self._x)

for x in (1., .1, .123456, .0123, .00123, .000123, .0000123, .00000123):
    p = Percentage(x)
    print '{0} {1:3} {2}'.format(x, p, 50 * p)

Выходы:

1.0 100.000% 50.0
0.1 10.000% 5.0
0.123456 12.346% 6.1728
0.0123 1.230% 0.615
0.00123 0.123% 0.0615
0.000123 0.012% 0.00615
1.23e-05 0.001% 0.000615
1.23e-06 0.0001% 6.15e-05

Вы можете сделать еще один умный анализ для at_least, чтобы также указать ширину поля, выравнивание и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...