0

'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」(接頭辞なし)も浮動小数点数に変換する必要があります

4

2 に答える 2

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)

注意すべきもう 1 つのことは、Python では、キャメルケースよりもアンダースコア変数名を使用する方が一般的であることです。pep-8 を参照してください: http://www.python.org/dev/peps/pep-0008/

于 2014-02-18T06:54:09.907 に答える
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

于 2014-02-18T07:08:58.183 に答える