2012-02-08 147 views
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

你的浮点数字包含逗号'“,”'而不是小数点'“。”'。 – 2012-02-08 15:01:37

回答

9

简单的方法是替换!一个简单的例子:

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

非常感谢大家! – StefanS 2012-02-08 15:27:41

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')