By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,538 Members | 2,225 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,538 IT Pros & Developers. It's quick & easy.

convert user input to Decimal objects using eval()?

P: n/a
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.

--
Julián
Jul 18 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a
[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
Jul 18 '05 #2

P: n/a
On Tuesday 29 March 2005 03:04, Raymond Hettinger wrote:
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!

--
Julián
Jul 18 '05 #3

P: n/a

"Raymond Hettinger" <vz******@verizon.net> wrote in message
news:6_72e.50077$u76.2569@trndny08...
[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

Jul 18 '05 #4

P: n/a
> > [Julian Hernandez Gomez]
is there a "easy way" to make eval() convert all floating
numbers to Decimal objects and return a Decimal?

[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/Coo.../Recipe/393265
Raymond
Jul 18 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.