drop trailing zeros from decimal drop trailing zeros from decimal python python

drop trailing zeros from decimal


You can use the normalize method to remove extra precision.

>>> print decimal.Decimal('5.500')5.500>>> print decimal.Decimal('5.500').normalize()5.5

To avoid stripping zeros to the left of the decimal point, you could do this:

def normalize_fraction(d):    normalized = d.normalize()    sign, digits, exponent = normalized.as_tuple()    if exponent > 0:        return decimal.Decimal((sign, digits + (0,) * exponent, 0))    else:        return normalized

Or more compactly, using quantize as suggested by user7116:

def normalize_fraction(d):    normalized = d.normalize()    sign, digit, exponent = normalized.as_tuple()    return normalized if exponent <= 0 else normalized.quantize(1)

You could also use to_integral() as shown here but I think using as_tuple this way is more self-documenting.

I tested these both against a few cases; please leave a comment if you find something that doesn't work.

>>> normalize_fraction(decimal.Decimal('55.5'))Decimal('55.5')>>> normalize_fraction(decimal.Decimal('55.500'))Decimal('55.5')>>> normalize_fraction(decimal.Decimal('55500'))Decimal('55500')>>> normalize_fraction(decimal.Decimal('555E2'))Decimal('55500')


There's probably a better way of doing this, but you could use .rstrip('0').rstrip('.') to achieve the result that you want.

Using your numbers as an example:

>>> s = str(Decimal('2.5') * 10)>>> print s.rstrip('0').rstrip('.') if '.' in s else s25>>> s = str(Decimal('2.5678') * 1000)>>> print s.rstrip('0').rstrip('.') if '.' in s else s2567.8

And here's the fix for the problem that gerrit pointed out in the comments:

>>> s = str(Decimal('1500'))>>> print s.rstrip('0').rstrip('.') if '.' in s else s1500


Answer from the Decimal FAQ in the documentation:

>>> def remove_exponent(d):...     return d.quantize(Decimal(1)) if d == d.to_integral() else d.normalize()>>> remove_exponent(Decimal('5.00'))Decimal('5')>>> remove_exponent(Decimal('5.500'))Decimal('5.5')>>> remove_exponent(Decimal('5E+3'))Decimal('5000')