convert user input to Decimal objects using eval()?
Raymond Hettinger
vze4rx4y at verizon.net
Tue Mar 29 03:04:18 EST 2005
[Julian Hernandez Gomez]
> This is maybe a silly question, but...
>
> is there a "easy way" to make eval() convert all floating
> numbers to Decimal objects and return a Decimal?
from decimal import Decimal
import re
number = re.compile(r"((\b|(?=\W))(\d+(\.\d*)?|\.\d+)([eE][+-]?\d{1,3})?)")
deciexpr = lambda s: number.sub(r"Decimal('\1')", s)
for s in ('1.00000001+0.1111111',
'+21.3e-5*85-.1234/81.6',
'1.0/7'):
print '%s\n --> %r' % (s, eval(s))
s = deciexpr(s)
print '%s\n --> %r\n' % (s, eval(s))
"""
1.00000001+0.1111111
--> 1.11111111
Decimal('1.00000001')+Decimal('0.1111111')
--> Decimal("1.11111111")
+21.3e-5*85-.1234/81.6
--> 0.016592745098039215
+Decimal('21.3e-5')*Decimal('85')-Decimal('.1234')/Decimal('81.6')
--> Decimal("0.01659274509803921568627450980")
1.0/7
--> 0.14285714285714285
Decimal('1.0')/Decimal('7')
--> Decimal("0.1428571428571428571428571429")
"""
Raymond Hettinger
More information about the Python-list
mailing list