keeping same formatting for floating point values
-
03-07-2019 - |
Question
I have a python program that reads floating point values using the following regular expression
(-?\d+\.\d+)
once I extract the value using float(match.group(1)), I get the actual floating point number. However, I am not able to distinguish if the number was 1.2345678 or 1.234 or 1.2340000.
The problem I am facing is to print out the floating point value again, with the exact same formatting. An easy solution is to "split and count" the floating point value when still a string, eg splitting at the decimal point, and counting the integer part length and the fractional part length, then create the formatter as
print "%"+str(total_len)+"."+str(fractional_len)+"f" % value
but maybe you know a standard way to achieve the same result ?
Solution
You method is basically correct.
String formatting has a less often used *
operator you can put for the formatting sizes, here's some code:
import re
def parse_float(str):
re_float = re.compile(r'(-?)(\d+)\.(\d+)')
grps = re_float.search(str)
sign, decimal, fraction = grps.groups()
float_val = float('%s%s.%s' % (sign, decimal, fraction))
total_len = len(grps.group(0))
print '%*.*f' % (total_len, len(fraction), float_val)
parse_float('1.2345678')
parse_float('1.234')
parse_float('1.2340000')
and it outputs
1.2345678
1.234
1.2340000
OTHER TIPS
If you want to keep a fixed precision, avoid using float
s and use Decimal
instead:
>>> from decimal import Decimal
>>> d = Decimal('-1.2345')
>>> str(d)
'-1.2345'
>>> float(d)
-1.2344999999999999
>>> from decimal import Decimal as d
>>> d('1.13200000')
Decimal('1.13200000')
>>> print d('1.13200000')
1.13200000