435,538 Members | 2,225 Online
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
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" 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.