【问题标题】:format string syntax: printing percentage with at least one significant digit格式字符串语法:以至少一位有效数字打印百分比
【发布时间】:2012-02-27 06:46:40
【问题描述】:

我想将数字格式化为百分比,小数点后至少有 2 位;此外,至少有一位有效数字。

例如,我希望 0.123456 看起来像“12.34%”;和 0.00000123456 看起来像 '0.0001%'。

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

原因是我的标准输出应该是定点数,点后有2位小数;但是如果数字太小以至于看起来像 0.00%,我需要显示至少一个有效数字,以便与真正的 0 区分开来。

【问题讨论】:

    标签: python formatting python-3.x


    【解决方案1】:
    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 - 非常简洁的解决方案。没有意识到你可以嵌套这样的格式说明符。小提示 - 在使用此之前,您需要 import math
    • 我假设当我真正需要在一个大的print 语句中使用时,我必须这样做:print('The answer is {} out of the total'.format(format_percent(fraction)))?想必没有办法扩展标准的{} 语言来添加这种特殊格式?
    • 您可能需要检查零值和负值以避免ValueError: math domain error 异常。
    • 另外,有时打印出来的值是 0.000010%。有什么办法可以避免最后的零?
    【解决方案2】:

    如果您将百分比包装在一个类中,您可以在其 format 方法中执行操作,并且仍将其用于正常计算。您还可以将争论解析为 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 做一些更聪明的解析,以指定字段宽度、对齐方式等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多