我想将数字格式化为百分比,小数点后至少2位数;此外,至少有一个有效数字。
例如,我希望0.123456看起来像'12 .34%';和0.00000123456看起来像'0.0001%'。
有没有一种简单的方法可以实现这一目标?
原因是我的标准输出应该是一个固定的点数,后面有2位小数;但如果数字很小,看起来像0.00%,我需要显示至少一个有效数字,以便区别于真实数字。
答案 0 :(得分:9)
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%'
答案 1 :(得分:2)
如果您将百分比包装在一个类中,您可以使用格式方法执行操作,并仍然将其用于正常计算。您还可以将争论解析为格式(“{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做一些更聪明的解析,也可以指定字段宽度,对齐等。