diff --git a/mapytex/calculus/core/str2.py b/mapytex/calculus/core/str2.py index 0fb6241..cac4c2b 100644 --- a/mapytex/calculus/core/str2.py +++ b/mapytex/calculus/core/str2.py @@ -11,6 +11,7 @@ Converting a string with coroutines """ from functools import partial +from decimal import Decimal from .coroutine import * __all__ = ["str2", ] @@ -158,7 +159,7 @@ def lookfor(condition, replace = lambda x:''.join(x)): else: if c is not None: acc.append(c) - found = condition(''.join(acc)) + found = condition(''.join([str(i) for i in acc])) if found == "maybe": ans = "maybe" elif found: @@ -322,14 +323,14 @@ def lookforNumbers(target): ... str2list.send(i) >>> a = str2list.throw(STOOOP) >>> print(a) - ['12', '+', '1234', '*', '67'] + [12, '+', 1234, '*', 67] >>> str2list = lookforNumbers(list_sink) >>> for i in "1.2+12.34*67": ... str2list.send(i) >>> a = str2list.throw(STOOOP) >>> print(a) - ['1.2', '+', '12.34', '*', '67'] + [Decimal('1.2'), '+', Decimal('12.34'), '*', 67] >>> str2list = lookforNumbers(list_sink) >>> for i in "12.3.4*67": @@ -368,7 +369,7 @@ def lookforNumbers(target): current += tok else: if current: - target_.send(current) + target_.send(typifiy_numbers(current)) current = "" target_.send(tok) else: @@ -376,9 +377,16 @@ def lookforNumbers(target): except STOOOP as err: if current: - target_.send(current) + target_.send(typifiy_numbers(current)) yield target_.throw(err) +def typifiy_numbers(number): + """ Transform a str number into a integer or a decimal """ + try: + return int(number) + except ValueError: + return Decimal(number) + @coroutine def pparser(target): """ Parenthesis parser sink @@ -447,15 +455,15 @@ def str2(sink): >>> exp = "12+3*4" >>> t = str2nestedlist(exp) >>> print(t) - ['12', '+', '3', '*', '4'] + [12, '+', 3, '*', 4] >>> exp = "12*3+4" >>> t = str2nestedlist(exp) >>> print(t) - ['12', '*', '3', '+', '4'] + [12, '*', 3, '+', 4] >>> exp = "12*(3+4)" >>> t = str2nestedlist(exp) >>> print(t) - ['12', '*', ['3', '+', '4']] + [12, '*', [3, '+', 4]] >>> from .tree import MutableTree >>> str2tree = str2(MutableTree.sink)