dropping trailing '.0' from floats
I'm looking for a way to convert numbers to string format, dropping any redundant '.0'
The input data is a mix of floats and strings. Desired output:
0 --> '0'
0.0 --> '0'
0.1 --> '0.1'
1.0 --> '1'
I've come up with the following generator expression, but I wonder if there's a faster way:
(str(i).rstrip('.0') if i else '0' for i in lst)
The truth check is there to prevent 0 from becoming an empty string.
EDIT: The more or less acceptable solution I have for now is this:
('%d'%i if i == int(i) else '%s'%i for i in lst)
It just seems strange that there is no elegant way to handle this (fairly straightforward) case in python.
See PEP 3101:
'g' - General format. This prints the number as a fixed-point number, unless the number is too large, in which case it switches to 'e' exponent notation.
Old style (not preferred):
>>> "%g" % float(10)
'10'
New style:
>>> '{0:g}'.format(float(21))
'21'
New style 3.6+:
>>> f'{float(21):g}'
'21'
rstrip
doesn't do what you want it to do, it strips any of the characters you give it and not a suffix:
>>> '30000.0'.rstrip('.0')
'3'
Actually, just '%g' % i
will do what you want.
EDIT: as Robert pointed out in his comment this won't work for large numbers since it uses the default precision of %g which is 6 significant digits.
Since str(i)
uses 12 significant digits, I think this will work:
>>> numbers = [ 0.0, 1.0, 0.1, 123456.7 ]
>>> ['%.12g' % n for n in numbers]
['1', '0', '0.1', '123456.7']
>>> x = '1.0'
>>> int(float(x))
1
>>> x = 1
>>> int(float(x))
1
(str(i)[-2:] == '.0' and str(i)[:-2] or str(i) for i in ...)
def floatstrip(x):
if x == int(x):
return str(int(x))
else:
return str(x)
Be aware, though, that Python represents 0.1 as an imprecise float, on my system 0.10000000000000001 .