"Raymond Hettinger" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > [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 -- http://mail.python.org/mailman/listinfo/python-list