2012-02-27 19 views
3

我想将数字格式化为百分比,小数点后至少有两位数字;此外至少有一位有效数字。格式字符串语法:至少包含一个有效数字的打印百分比

例如,我想0.123456看起来像'12 .34%';和0.0000看起来像'0.0001%'。

有没有简单的方法来实现这一目标?

原因是我的标准输出应该是点后的2位小数的定点数;但如果数量是如此之小,它看起来像0.00%,我需要拿出至少一个显著位,因此可以从真正的0

回答

2

如果您将百分比包装在课程中,则可以使用格式方法执行操作,并仍将其用于正常计算。你也可以解析arguement到格式(之间的部分:在 '{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..230% 0.615 
0.0.123% 0.0615 
0.00.012% 0.00615 
1.23e-05 0.001% 0.000615 
1.23e-06 0.0001% 6.15e-05 

你可以为at_least做一些更巧妙的解析,以指定字段宽度,对齐方式等。

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..23% 
0.0.12% 
0.00.01% 
1.23e-05 0.001% 
1.23e-06 0.0001% 

更多情况来区分不同的at_least

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

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

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

>>> format_percent(1.23456, 0) 
'123%' 
+3

+1 - 非常整洁的解决方案。没有意识到你可以嵌套格式说明符那样小问题 - 你需要''输入数学''在使用之前。 – Blair 2012-02-27 07:50:41

+0

@Blair - 谢谢,'math' importe d现在。 – eumiro 2012-02-27 07:54:00

+1

我假设当我真的需要在一个大的'print'语句中使用时,我必须这样做:'print('答案是{total.format(format_percent(fraction)))''中的{}据推测,没有办法扩展标准的语言来添加这种特殊的格式? – max 2012-02-27 16:37:05

相关问题