SIfloat.py 1.77 KB
Newer Older
1
2
3
4
5
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

6
7
import os
import re
8
import pykat.exceptions as pkex
9
import numpy as np
10

11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
__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
            }
            
28
def SIfloat(value):
29
30
    if value==None: 
        return value
31
32
33
34
35
36
37
38
39
        
    value = np.array(value)
    
    v = np.vectorize(convertToFloat)
    
    if value.size == 1:
        return float(v(value))
        
    a = v(value)
40
    
41
42
    if len(a) == 1:
        return a[0]
43
    else:
44
        return a
45
46
    
def convertToFloat(value):
47
    
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    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))
64
        
65
66
67
68
        try:   
            return float(value)
        except ValueError as ex:
            raise pkex.BasePyKatException("Unable to convert '{0}' into a float".format(value))