diff --git a/pykat/SIfloat.py b/pykat/SIfloat.py index 23e863f1cf33edae1703b8f959a45c5191e7229b..5a3556b8b548aa89b7d53dca0a2157e457fe6c33 100644 --- a/pykat/SIfloat.py +++ b/pykat/SIfloat.py @@ -1,36 +1,53 @@ import os import re +import pykat.exceptions as pkex -#staticmethod +__suffix = {'y': 'e-24', # yocto + 'z': 'e-21', # zepto + 'a': 'e-18', # atto + 'f': 'e-15', # femto + 'p': 'e-12', # pico + 'n': 'e-9', # nano + 'u': 'e-6', # micro + 'm': 'e-3', # mili + 'c': 'e-2', # centi + 'd': 'e-1', # deci + 'k': 'e3', # kilo + 'M': 'e6', # mega + 'G': 'e9', # giga + 'T': 'e12', # tera + 'P': 'e15' # peta + } + def SIfloat(value): if value==None: return value + if type(value)==list: return [convertToFloat(s) for s in value] else: return convertToFloat(value) def convertToFloat(value): - __suffix = {'y': 'e-24', # yocto - 'z': 'e-21', # zepto - 'a': 'e-18', # atto - 'f': 'e-15', # femto - 'p': 'e-12', # pico - 'n': 'e-9', # nano - 'u': 'e-6', # micro - 'm': 'e-3', # mili - 'c': 'e-2', # centi - 'd': 'e-1', # deci - 'k': 'e3', # kilo - 'M': 'e6', # mega - 'G': 'e9', # giga - 'T': 'e12', # tera - 'P': 'e15' # peta - } - - value = str(value) - for i, j in __suffix.iteritems(): - value=value.replace(i, str(j)) + try: + # first just try and convert the value + return float(value) + + except ValueError as ex: + # Catch any casting exeception + value = value.strip() + + # only the last value can be an SI scaling letter + last = value[-1] + + if last in __suffix: + # remove last character and append the SI scaling + value = value[0:-1] + __suffix[last] + else: + raise pkex.BasePyKatException("Could not convert SI scaling in '{0}' to a float".format(value)) - return float(value) + try: + return float(value) + except ValueError as ex: + raise pkex.BasePyKatException("Unable to convert '{0}' into a float".format(value))