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
        self.add_leading_zeros = add_leading_zeros # fill the start of the number with zeros, so there are at least this number of digits before the decimal point
        self.add_trailing_zeros = add_trailing_zeros # fill the end of the number with zeros, as defined by "number_of_decimal_places"
        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 - .5
            else: f = f + .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
