我经常使用这个小函数eng(x)
,特别是以易于阅读的方式显示大小数字。
这允许我写"%e" % (number)
。
我希望能够编写"%n" % (number)
并获取此eng(x)
函数格式化的数字。
有办法做到这一点吗?
答案 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
。