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