如何定义新的字符串格式化程序

时间:2014-02-07 06:52:16

标签: python

我经常使用这个小函数eng(x),特别是以易于阅读的方式显示大小数字。

这允许我写"%e" % (number)

我希望能够编写"%n" % (number)并获取此eng(x)函数格式化的数字。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:0)

您可以实施新的数字类:

from math import floor, log10
class snumber(float):
        def powerise10(x):
            if x == 0: return 0 , 0 
            Neg = x <0
            if Neg : x = -x
            a = 1.0 * x / 10**(floor(log10(x)))
            b = int(floor(log10(x)))
            if Neg : a = -a
            return a ,b

        def __str__(x):
            a , b = snumber.powerise10(x)
            if -3<b<3: return "%.4g" % x 
            a = a * 10**(b%3)
            b = b - b%3 
            return "%.4g*10^%s" %(a,b)

print "{}".format(snumber(100000))

给出:

100*10^3

答案 1 :(得分:0)

经过进一步研究,我发现如何根据@bereal的建议继承string.Formatter

import string
from math import floor, log10

class CustFormatter(string.Formatter):
    "Defines special formatting"
    def __init__(self):
        super(CustFormatter, self).__init__()

    def powerise10(self, x):
        if x == 0: return 0, 0
        Neg = x < 0
        if Neg: x = -x
        a = 1.0 * x / 10**(floor(log10(x)))
        b = int(floor(log10(x)))
        if Neg: a = -a
        return a, b

    def eng(self, x):
        a, b = self.powerise10(x)
        if -3 < b < 3: return "%.4g" % x
        a = a * 10**(b%3)
        b = b - b%3
        return "%.4g*10^%s" % (a, b)

    def format_field(self, value, format_string):
      # handle an invalid format
      if format_string == "i":
          return self.eng(value)
      else:
          return super(CustFormatter,self).format_field(value, format_string)

fmt = CustFormatter()
print('{}'.format(0.055412))
print(fmt.format("{0:i} ", 55654654231654))
print(fmt.format("{} ", 0.00254641))

唯一的问题是,如果我没有按位置引用变量,我已经部分地将其分解为最后一行,我得到KeyError