Project

General

Profile

« Previous | Next » 

Revision 1566

units.py: convert(): Added support for unit conversions. Added initial unit conversion for % -> unitless. str2quantity(): Fixed regexp to match % as units. Set Quantity.__repr__ to quantity2str.

View differences:

lib/units.py
27 27
    return str_
28 28

  
29 29
Quantity.__str__ = quantity2str
30
Quantity.__repr__ = quantity2str
30 31

  
31 32
def str2quantity(str_):
32 33
    value = str_
33 34
    units = None
34 35
    if not str_.isdigit(): # optimization to avoid regexp for simple cases
35
        match = re.match(ur'(?i)^\s*(.*?\d\.?)\s*([a-z\'"°][\w.*/^-]*?)?\s*$',
36
        match = re.match(ur'(?i)^\s*(.*?\d\.?)\s*([a-z%\'"°][\w.*/^-]*?)?\s*$',
36 37
            str_)
37 38
        if match: value, units = match.groups() # has units
38 39
    return Quantity(value, units)
......
40 41
def set_default_units(quantity, units):
41 42
    if quantity.units == None: quantity.units = units
42 43

  
44
conversions = {
45
    ('%', None): 1./100
46
}
47

  
43 48
def convert(quantity, units):
44 49
    units = std_units(units)
45 50
    if quantity.units == units: return quantity # units already correct
46
    elif units == None: return Quantity(quantity.value, units) # remove units
47
    elif quantity.units == None: raise MissingUnitsException(quantity)
48
        # can't convert quantity with unknown units
49
    else: raise NotImplementedError('Unit conversion not implemented yet')
51
    try: conversion = conversions[(quantity.units, units)]
52
    except KeyError:
53
        if units == None: return Quantity(quantity.value, units) # remove units
54
        elif quantity.units == None: raise MissingUnitsException(quantity)
55
            # can't convert quantity with unknown units
56
        else: raise NotImplementedError('Unit conversion not implemented yet')
57
    else:
58
        return Quantity(str(format.str2float(quantity.value)*conversion), units)

Also available in: Unified diff