import math class Format: def __init__( self, number_of_decimal_places=3, add_leading_zeros=1, add_trailing_zeros=False, dp_wanted=True, add_plus=False, no_minus=False, round_down=False, ): self.number_of_decimal_places = number_of_decimal_places # fill the start of the number with zeros, so there are at least this number of digits before the decimal point self.add_leading_zeros = add_leading_zeros # fill the end of the number with zeros, as defined by "number_of_decimal_places" self.add_trailing_zeros = add_trailing_zeros self.dp_wanted = dp_wanted self.add_plus = add_plus self.no_minus = no_minus self.round_down = round_down def string(self, number): if number == None: return "None" f = float(number) * math.pow(10, self.number_of_decimal_places) s = format(f, "f") if self.round_down == False: if f < 0: f = f - 0.5 else: f = f + 0.5 s = format(float(number), "f") if math.fabs(f) < 1.0: s = "0" minus = False if s[0] == "-": minus = True if self.no_minus: s = s[1:] dot = s.find(".") if dot == -1: before_dp = s after_dp = "" else: before_dp = s[0:dot] after_dp = s[dot + 1 : dot + 1 + self.number_of_decimal_places] before_dp = before_dp.zfill(self.add_leading_zeros) if self.add_trailing_zeros: for i in range(0, self.number_of_decimal_places - len(after_dp)): after_dp += "0" else: after_dp = after_dp.rstrip("0") s = "" if minus == False: if self.add_plus == True: s += "+" s += before_dp if len(after_dp): if self.dp_wanted: s += "." s += after_dp return s class Address: def __init__(self, text, fmt=Format(), modal=True): self.text = text self.fmt = fmt self.modal = modal self.str = None self.previous = None def set(self, number): self.str = self.text + self.fmt.string(number) def write(self, writer): if self.str == None: return "" if self.modal: if self.str != self.previous: writer.write(writer.SPACE() + self.str) self.previous = self.str else: writer.write(writer.SPACE() + self.str) self.str = None class AddressPlusMinus(Address): def __init__(self, text, fmt=Format(), modal=True): Address.__init__(self, text, fmt, modal) self.str2 = None self.previous2 = None def set(self, number, text_plus, text_minus): Address.set(self, number) if float(number) > 0.0: self.str2 = text_plus else: self.str2 = text_minus def write(self, writer): Address.write(self, writer) if self.str2 == None: return "" if self.modal: if self.str2 != self.previous2: writer.write(writer.SPACE() + self.str2) self.previous2 = self.str2 else: writer.write(writer.SPACE() + self.str2) self.str2 = None