Если вы оберните процент в классе, вы можете делать что-то в его методе 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, чтобы также указать ширину поля, выравнивание и т. Д.