convert user input to Decimal objects using eval()?

  • Thread starter Julian Hernandez Gomez
  • Start date
J

Julian Hernandez Gomez

Hi !

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?

for example:

eval('1.00000001+0.1111111') --> convert each number to a Decimal object,
perform the sum and obtain a Decimal object as a result?

maybe a parser is needed, but eval() already do the job, but I need the
precision that Decimal offers for numerical applications.

Thanks in advance.
 
R

Raymond Hettinger

[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
 
J

Julian Hernandez Gomez

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))

Wow!

Thank you so much!!!

now I can do my simple math function evaluator much more reliable !

Thanks again!
 
T

Terry Reedy

Raymond Hettinger said:
[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")

This is less obvious and more useful, to me, than some of the recipies in
the new Cookbook.

TJR
 
R

Raymond Hettinger

[Julian Hernandez Gomez]
[Raymond Hettinger]
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)

[Terry Reedy]
This is less obvious and more useful, to me, than some of the recipies in
the new Cookbook.

Okay, we can fix that. I've cleaned it up a bit and posted it on ASPN with
references, docs, and a doctest:

http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/393265


Raymond
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,008
Latest member
HaroldDark

Latest Threads

Top