为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 SI 前缀(micro、milli、Mega、Giga 等)格式化数字?

如何使用 SI 前缀(micro、milli、Mega、Giga 等)格式化数字?

慕沐林林 2021-12-08 16:28:04
我的数字范围从非常小到非常大,我想使用带有大小和后缀的“工程符号”来格式化它们:n.nnn S其中 1.0 <= n.nnn < 1000.,S 是度量 (SI) 前缀。所以:1234.5e+13 => 12.35P12345678 => 12.35M1234 => 1.234K1.234 => 1.2340.1234 => 123.4m1234.5e-16 => 1.235f等我该怎么做,例如使用 Python?
查看完整描述

2 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

(以问答方式发布在这里,因为我一直在重新发明这段代码,其他人可能会发现它很有帮助。如果您看到改进,请随时调整它......)


这是一种实现,可让您选择长后缀(例如“peta”)或短后缀(例如“P”),还可以让您选择显示的总位数(即精度):


def si_classifier(val):

    suffixes = {

        24:{'long_suffix':'yotta', 'short_suffix':'Y', 'scalar':10**24},

        21:{'long_suffix':'zetta', 'short_suffix':'Z', 'scalar':10**21},

        18:{'long_suffix':'exa', 'short_suffix':'E', 'scalar':10**18},

        15:{'long_suffix':'peta', 'short_suffix':'P', 'scalar':10**15},

        12:{'long_suffix':'tera', 'short_suffix':'T', 'scalar':10**12},

        9:{'long_suffix':'giga', 'short_suffix':'G', 'scalar':10**9},

        6:{'long_suffix':'mega', 'short_suffix':'M', 'scalar':10**6},

        3:{'long_suffix':'kilo', 'short_suffix':'k', 'scalar':10**3},

        0:{'long_suffix':'', 'short_suffix':'', 'scalar':10**0},

        -3:{'long_suffix':'milli', 'short_suffix':'m', 'scalar':10**-3},

        -6:{'long_suffix':'micro', 'short_suffix':'µ', 'scalar':10**-6},

        -9:{'long_suffix':'nano', 'short_suffix':'n', 'scalar':10**-9},

        -12:{'long_suffix':'pico', 'short_suffix':'p', 'scalar':10**-12},

        -15:{'long_suffix':'femto', 'short_suffix':'f', 'scalar':10**-15},

        -18:{'long_suffix':'atto', 'short_suffix':'a', 'scalar':10**-18},

        -21:{'long_suffix':'zepto', 'short_suffix':'z', 'scalar':10**-21},

        -24:{'long_suffix':'yocto', 'short_suffix':'y', 'scalar':10**-24}

    }

    exponent = int(math.floor(math.log10(abs(val))/3.0)*3)

    return suffixes.get(exponent, None)


def si_formatter(value):

    '''

    Return a triple of scaled value, short suffix, long suffix, or None if

    the value cannot be classified.

    '''

    classifier = si_classifier(value)

    if classifier == None:

        # Don't know how to classify this value

        return None


    scaled = value / classifier['scalar']

    return (scaled, classifier['short_suffix'], classifier['long_suffix'])


def si_format(value, precision=4, long_form=False, separator=''):

    '''

    "SI prefix" formatted string: return a string with the given precision

    and an appropriate order-of-3-magnitudes suffix, e.g.:

        si_format(1001.0) => '1.00K'

        si_format(0.00000000123, long_form=True, separator=' ') => '1.230 nano'

    '''

    scaled, short_suffix, long_suffix = si_formatter(value)


    if scaled == None:

        # Don't know how to format this value

        return value


    suffix = long_suffix if long_form else short_suffix


    if abs(scaled) < 10:

        precision = precision - 1

    elif abs(scaled) < 100:

        precision = precision - 2

    else:

        precision = precision - 3


    return '{scaled:.{precision}f}{separator}{suffix}'.format(

        scaled=scaled, precision=precision, separator=separator, suffix=suffix)


查看完整回答
反对 回复 2021-12-08
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

您可以使用具有浮点类型和附加格式选项的Prefixed。


>>> from prefixed import Float


>>> f'{Float(1234.5e+13):.2h}'

'12.35P'

>>> f'{Float(12345678):.2h}'

'12.35M'

>>> f'{Float(1234):.2h}'

'1.23k'

>>> f'{Float(1.234):.2h}'

'1.23'

>>> f'{Float(0.1234):.2h}'

'123.40m'

>>> f'{Float(1234.5e-16):.2h}'

'123.45f'


查看完整回答
反对 回复 2021-12-08
  • 2 回答
  • 0 关注
  • 326 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信