2014-02-18 3 views
0

У меня есть строка, как '102.3k' Я хотел бы преобразовать эту строку с машинописным обозначением числа float.Преобразовать строку с инженерным префиксом в float

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

Разрешенные префиксы

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

к означает 10^3

М означает 10^6

м означает 10^-3

μ средство 10^-6

Я думаю, что я должен использовать регулярное выражение для этого, но у меня очень мало опыта с регулярным выражением.

изменения: в идеале решение должно также быть в состоянии преобразовать любую строку так «102,3» (без префикса) также должны быть преобразованы, чтобы плавать

+0

Я не уверен, что если люди будут действительно прочитать вики, чтобы ответить на этот вопрос. Возможно, вы захотите включить ожидаемый результат. – thefourtheye

ответ

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/

+0

neg_postfixes должно быть 'num * = 10 ** ((neg_postfixes.index (num_postfix) + 1) * -3)' – algrebe

+0

хороший улов, исправлено! – simonzack

+0

Да, я писал ответ действительно красиво, а затем отправил ответ: P так фигурный идентификатор просто проверьте его. Кроме того, работает neg_postfixes? Я попробовал это на [link] (http://www.compileonline.com/execute_python_online.php), и это дало мне ошибку ** Не-ASCII-символ '\ xc2' ** для второго элемента 'μ' – algrebe

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

+0

Мне нравится ваша идея диктата – working4coins

Смежные вопросы