将带有工程师前缀的字符串转换为float

时间:2014-02-18 06:46:46

标签: python regex numbers metric

我有一个像'102.3k'这样的字符串我想将带有工程师前缀表示法的字符串转换为浮点数。

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

允许的前缀是

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

k表示10 ^ 3

M表示10 ^ 6

m表示10 ^ -3

μ表示10 ^ -6

我认为我应该使用正则表达式执行此操作,但我对正则表达式的经验很少。

编辑:理想情况下,解决方案也应该能够转换任何字符串,因此'102.3'(不带前缀)也应该转换为float

2 个答案:

答案 0 :(得分:4)

试试这个,不需要正则表达式:

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

num_postfix = n[-1]
if num_postfix in pos_postfixes:
    num = float(n[:-1])
    num*=10**((pos_postfixes.index(num_postfix)+1)*3)
elif num_postfix in neg_postfixes:
    num = float(n[:-1])
    num*=10**(-(neg_postfixes.index(num_postfix)+1)*3)
else:
    num = float(n)
print(num)

另外需要注意的是,在python中,使用下划线变量名比camelcasing更常见,请参阅pep-8:http://www.python.org/dev/peps/pep-0008/

答案 1 :(得分:1)

如果您想控制该值,可以试试这个:

import decimal
posPrefixes = {'k':'10E3', 'M':'10E6', 'G':'10E9', 'T':'10E12', 'P':'10E15', 'E':'10E18', 'Z':'10E21', 'Y':'10E24'}
negPrefixes = {'m':'10E-3', '?':'10E-6', 'n':'10E-9', 'p':'10E-12', 'f':'10E-15', 'a':'10E-18', 'z':'10E-21', 'y':'10E-24'}
val='102.3k'
if val[-1] in posPrefixes.keys():
    v = decimal.Decimal(val[:-1])
    print v*decimal.Decimal(posPrefixes[val[-1]])

val ='102.3n'
if val[-1] in negPrefixes.keys():
    v = decimal.Decimal(val[:-1])
    print v*decimal.Decimal(negPrefixes[val[-1]])

输出:

1.0230E + 6

1.023e-06