在Python中使用工程符号(带有SI前缀)将浮点数转换为字符串

wor*_*ins 4 python string numbers

我有一个浮点数,如 x=23392342.1

我想将它转换为带有工程符号的字符串(带有公制前缀)

http://en.wikipedia.org/wiki/Engineering_notation http://en.wikipedia.org/wiki/Metric_prefix

所以在我的例子中23392342.1 = 23.3923421E6 = 23.3923421 M(兆)

我想展示 23.3923421 M

scl*_*cls 9

这是一个功能灵感来自格式化带有指标前缀的数字?

metric.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import math


def to_si(d, sep=' '):
    """
    Convert number to string with SI prefix

    :Example:

    >>> to_si(2500.0)
    '2.5 k'

    >>> to_si(2.3E6)
    '2.3 M'

    >>> to_si(2.3E-6)
    '2.3 µ'

    >>> to_si(-2500.0)
    '-2.5 k'

    >>> to_si(0)
    '0'

    """

    incPrefixes = ['k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']
    decPrefixes = ['m', 'µ', 'n', 'p', 'f', 'a', 'z', 'y']

    if d == 0:
        return str(0)

    degree = int(math.floor(math.log10(math.fabs(d)) / 3))

    prefix = ''

    if degree != 0:
        ds = degree/math.fabs(degree)
        if ds == 1:
            if degree - 1 < len(incPrefixes):
                prefix = incPrefixes[degree - 1]
            else:
                prefix = incPrefixes[-1]
                degree = len(incPrefixes)

        elif ds == -1:
            if -degree - 1 < len(decPrefixes):
                prefix = decPrefixes[-degree - 1]
            else:
                prefix = decPrefixes[-1]
                degree = -len(decPrefixes)

        scaled = float(d * math.pow(1000, -degree))

        s = "{scaled}{sep}{prefix}".format(scaled=scaled,
                                           sep=sep,
                                           prefix=prefix)

    else:
        s = "{d}".format(d=d)

    return(s)


if __name__ == "__main__":
    import doctest
    doctest.testmod()
Run Code Online (Sandbox Code Playgroud)

及其用法:

from metric import to_si
d = 23392342.1
print(to_si(d))
Run Code Online (Sandbox Code Playgroud)

它会显示出来

23.3923421 M
Run Code Online (Sandbox Code Playgroud)


小智 8

使用QuantiPhy包。它是一个稳定的有据可查且支持良好的软件包,旨在满足您的需求。

>>> from quantiphy import Quantity

>>> v = Quantity(23.3923421E6)                                               
>>> str(v)                                                                   
'23.392M'                                                                    

>>> v.render(prec='full')                                                    
'23.3923421M'
Run Code Online (Sandbox Code Playgroud)

通常人们使用 SI 单位前缀与单位,而 Quantity 旨在将单位与数字组合。

>>> v = Quantity(23.3923421E6, 'V')
>>> print(v)
23.392 MV

>>> f = Quantity('23.3923421 MHz')
>>> print('{}'.format(f))
23.392 MHz
Run Code Online (Sandbox Code Playgroud)

数量子类是浮动的,因此您可以像使用浮动一样在表达式中使用数量:

>>> t = 1/f                                                                  
>>> print(t)                                                                 
4.274903281275114e-08

>>> t = Quantity(t, 's')                                                     
>>> print(t)
42.749 ns
Run Code Online (Sandbox Code Playgroud)


Ray*_*ger 5

直接的解决方案是使用Decimal.to_eng_string方法,然后执行字典查找以将指数转换为适当的度量标准前缀.