-1.234e+018 --> '-1234000000000000000.0'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | def non_exp_repr(x):
"""Return a floating point representation without exponential notation.
Result is a string that satisfies:
float(result)==float(x) and 'e' not in result.
>>> non_exp_repr(1.234e-025)
'0.00000000000000000000000012339999999999999'
>>> non_exp_repr(-1.234e+018)
'-1234000000000000000.0'
>>> for e in xrange(-50,51):
... for m in (1.234, 0.018, -0.89, -75.59, 100/7.0, -909):
... x = m * 10 ** e
... s = non_exp_repr(x)
... assert 'e' not in s
... assert float(x) == float(s)
"""
s = repr(float(x))
e_loc = s.lower().find('e')
if e_loc == -1:
return s
mantissa = s[:e_loc].replace('.', '')
exp = int(s[e_loc+1:])
assert s[1] == '.' or s[0] == '-' and s[2] == '.', "Unsupported format"
sign = ''
if mantissa[0] == '-':
sign = '-'
mantissa = mantissa[1:]
digitsafter = len(mantissa) - 1 # num digits after the decimal point
if exp >= digitsafter:
return sign + mantissa + '0' * (exp - digitsafter) + '.0'
elif exp <= -1:
return sign + '0.' + '0' * (-exp - 1) + mantissa
ip = exp + 1 # insertion point
return sign + mantissa[:ip] + '.' + mantissa[ip:]
if __name__ == '__main__':
import doctest
print 'Doctest results:', doctest.testmod()
|
Sometimes you need to print or store floats without exponential notation.
The need arises in xmlrpc where the spec only allows decimal point notation. Also, for some applications, exponential notation is inappropriate for user output (i.e. new cars discounted to only 2.3499e+005).
Tags: text