Nach einer Bemerkung hier: How to define a new string formatter, versuchte ich Unterklasse string.Formatter
. Hier ist was ich getan habe. Leider scheinen ich es in der AsUnterklasse 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))
Prozess gebrochen zu haben, wenn wie in der letzten Zeile, ich habe nicht auf die Variablen von Position beziehen, habe ich eine KeyError
bekommen. Es erwartet natürlich einen Schlüssel, der in der ursprünglichen Klasse optional ist, aber ich verstehe nicht warum und ich bin mir nicht sicher, was ich falsch gemacht habe.
Vielen Dank, wissen Sie, was sind die + und - overding parse oder get_value wie vom vorherigen Poster angeboten? Oder ist es gleichwertig? – Cambium
@Cambium falsetrus Version sieht für mich lesbarer aus, außerdem müssen Sie eine Methode weniger überschreiben (obwohl Sie den Konstruktor überschreiben und ein Attribut einfügen müssen). Sein Lob über das Mischen der Stile gilt auch für meinen Code (obwohl Sie beide Versionen erweitern können, um das zu beheben). – bereal