def nice_units()

in simulation/bindings/python/rad_util.py [0:0]


def nice_units(value, dp=0, sigfigs=None, suffix='', space=' ',
               use_extra_prefixes=False, use_full_name=False, mode='si'):
    """Return value converted to human readable units eg milli, micro, etc.

    Arguments:
    value -- number in base units
    dp -- number of decimal places to display (rounded)
    sigfigs -- number of significant figures to display (rounded)
               This overrides dp if set.
    suffix -- optional unit suffix to append to unit multiplier
    space -- separator between value and unit multiplier (default: ' ')
    use_extra_prefixes -- use hecto, deka, deci and centi as well if set.
                          (default: False)
    use_full_name -- use full name for multiplier symbol,
                     e.g. milli instead of m
                     (default: False)
    mode -- 'si' for SI prefixes, 'bin' for binary multipliers (1024, etc.)
            (Default: 'si')

    SI prefixes from:
    http://physics.nist.gov/cuu/Units/prefixes.html
    (Greek mu changed to u.)
    Binary prefixes based on:
    http://physics.nist.gov/cuu/Units/binary.html

    >>> nice_units(2e-11)
    '20 p'

    >>> nice_units(2e-11, space='')
    '20p'

    """
    si_prefixes = {1e24:  ('Y', 'yotta'),
                   1e21:  ('Z', 'zetta'),
                   1e18:  ('E', 'exa'),
                   1e15:  ('P', 'peta'),
                   1e12:  ('T', 'tera'),
                   1e9:   ('G', 'giga'),
                   1e6:   ('M', 'mega'),
                   1e3:   ('k', 'kilo'),
                   1e-3:  ('m', 'milli'),
                   1e-6:  ('u', 'micro'),
                   1e-9:  ('n', 'nano'),
                   1e-12: ('p', 'pico'),
                   1e-15: ('f', 'femto'),
                   1e-18: ('a', 'atto'),
                   1e-21: ('z', 'zepto'),
                   1e-24: ('y', 'yocto')
                   }
    if use_extra_prefixes:
        si_prefixes.update({1e2:  ('h', 'hecto'),
                            1e1:  ('da', 'deka'),
                            1e-1: ('d', 'deci'),
                            1e-2: ('c', 'centi')
                            })
    bin_prefixes = {2**10: ('K', 'kilo'),
                    2**20: ('M', 'mega'),
                    2**30: ('G', 'mega'),
                    2**40: ('T', 'tera'),
                    2**50: ('P', 'peta'),
                    2**60: ('E', 'exa')
                    }
    if mode == 'bin':
        prefixes = bin_prefixes
    else:
        prefixes = si_prefixes
    prefixes[1] = ('', '')  # Unity.
    # Determine appropriate multiplier.
    multipliers = prefixes.keys()
    multipliers.sort()
    mult = None
    for i in range(len(multipliers) - 1):
        lower_mult = multipliers[i]
        upper_mult = multipliers[i+1]
        if lower_mult <= value < upper_mult:
            mult_i = i
            break
    if mult is None:
        if value < multipliers[0]:
            mult_i = 0
        elif value >= multipliers[-1]:
            mult_i = len(multipliers) - 1
    mult = multipliers[mult_i]
    # Convert value for this multiplier.
    new_value = value / mult
    # Deal with special case due to rounding.
    if sigfigs is None:
        if mult_i < (len(multipliers) - 1) and \
               round(new_value, dp) == \
               round((multipliers[mult_i+1] / mult), dp):
            mult = multipliers[mult_i + 1]
            new_value = value / mult
    # Concatenate multiplier symbol.
    if use_full_name:
        label_type = 1
    else:
        label_type = 0
    # Round and truncate to appropriate precision.
    if sigfigs is None:
        str_value = eval('"%.'+str(dp)+'f" % new_value', locals(), {})
    else:
        str_value = eval('"%.'+str(sigfigs)+'g" % new_value', locals(), {})
    return str_value + space + prefixes[mult][label_type] + suffix