我經常使用這個小函數eng(x)
特別是以易於閱讀的方式顯示大數或小數。我可以寫"%e" % (number)
。如何定義一個新的字符串格式化程序
我希望能寫"%n" % (number)
並得到這個eng(x)
函數格式化的數字。
有沒有辦法做到這一點?
我經常使用這個小函數eng(x)
特別是以易於閱讀的方式顯示大數或小數。我可以寫"%e" % (number)
。如何定義一個新的字符串格式化程序
我希望能寫"%n" % (number)
並得到這個eng(x)
函數格式化的數字。
有沒有辦法做到這一點?
您可以實現一個新的數字類:
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
經過進一步的研究,我發現如何繼承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
。
從那時起就已經解決了:http://stackoverflow.com/questions/21664318/subclass-string-formatter – Cambium
另請參閱http://stackoverflow.com/questions/18394385/extending-python-string-formatting-with-custom-conversion-types。您可能希望使用'str.format()'而不是使用基於'%'的格式化來使用新樣式格式。 – senshin
「%s」%eng(x) - 是你需要的嗎?但不知道。 –
新樣式格式允許您使用['string.Formatter'](http://docs.python.org/2/library/string.html#string.Formatter)定義自定義格式說明符,以便您可以編寫'myfmt .format('{0:n}',數字)' – bereal