2012-02-08 33 views
2

これは私のコードで、行の第2フィールドを指数関数から浮動小数点に変換しようとしています。指数関数を浮動小数点に変換する

outputrrd = processrrd.communicate() 
(output, error) = outputrrd 
output_lines = output.split('\n') 
for line in output_lines: 
    m = re.search(r"(.*): ", line) 
    if m != None: 
     felder = line.split(': ') 
     epoch = felder[0].strip(':') 
     utc = epoch2normal(epoch).strip("\n") 
     #print felder[1] 
     data = float(felder[1]) 
     float_data = data * 10000000 
     print float_data 
     resultslist.append(utc + ' ' + hostname + ' ' + float_data) 

しかし、プログラムは、このエラーで停止:

File "/opt/omd/scripts/python/livestatus/rrdfetch-convert.py", line 156, in <module> 
    data = float(felder[1]) 
ValueError: invalid literal for float(): 6,0865000000e-01 

誰もがその理由を知っていますか?

+0

フロートリテラルに小数点の代わりにカンマ '、"が含まれています。 –

答えて

9

簡単な方法で置き換えてください!一つの簡単な例:

value=str('6,0865000000e-01') 
value2=value.replace(',', '.') 
float(value2) 
0.60865000000000002 
+0

大変ありがとうございました! – StefanS

9

理由は、6,0865000000e-01でコンマを使用しているためです。 float()はロケール対応ではないため、これは機能しません。詳細は、PEP 331を参照してください。

locale.atof()を試してください。または、カンマをドットで置き換えてください。

0

私はそれがあなたにとって有用であると思う:

def remove_exponent(value): 
    """ 
     >>>(Decimal('5E+3')) 
     Decimal('5000.00000000') 
    """ 
    decimal_places = 8 
    max_digits = 16 

    if isinstance(value, decimal.Decimal): 
     context = decimal.getcontext().copy() 
     context.prec = max_digits 
     return "{0:f}".format(value.quantize(decimal.Decimal(".1") ** decimal_places, context=context)) 
    else: 
     return "%.*f" % (decimal_places, value) 
0

単にフロートに文字列をキャストすることによって:

new_val = float('9.81E7') 
0

あなたはのでfloatを変換する必要はありませんその値はです。の場合は、formatを使用して表示します。

print format(the_float, '.8f') 
関連する問題