numbers.py (995B)
1 # standard imports 2 import re 3 import logging 4 5 logg = logging.getLogger(__name__) 6 7 8 re_number_postfix = r'^(\d+(\.\d+)?)(([kmgtpezyE])(-?\d+)?)?$' 9 def postfix_to_int(s): 10 s = s.replace(' ', '') 11 m = re.match(re_number_postfix, s) 12 if not m: 13 raise ValueError('invalid postfix expansion value: {}'.format(s)) 14 v = 0 15 d = 0 16 p = 0 17 if m[2] == None: 18 v = int(m[1]) 19 else: 20 (n, f) = m[1].split('.') 21 if int(f) == 0: 22 v = int(n) 23 else: 24 p -= len(f) 25 v = int(n + f) 26 27 if m[4] == 'k': 28 p += 3 29 elif m[4] == 'm': 30 p += 6 31 elif m[4] == 'g': 32 p += 9 33 elif m[4] == 't': 34 p += 12 35 elif m[4] == 'p': 36 p += 15 37 elif m[4] == 'e': 38 p += 18 39 elif m[4] == 'z': 40 p += 21 41 elif m[4] == 'y': 42 p += 24 43 elif m[4] == 'E': 44 p += int(m[5]) 45 46 r = int(v * (10 ** p)) 47 logg.debug('number {} translated to {}'.format(s, r)) 48 49 return r