2011-06-20 41 views
5

This question pregunta cómo suprimir la notación científica en python.¿Cómo evitar la impresión de notación científica en python sin agregar dígitos adicionales?

Tengo una serie de números para mostrar (pequeñas potencias de 10) y me gustaría mostrarlos sin los ceros finales. Es decir. 0.1, 0.01, y así sucesivamente a 0.000001

Si lo hago "%s" % 10 ** -6 obtengo '1e-06'. Si uso "%f" % 10 ** -6 obtengo '0.000001' que es lo que quiero.

Sin embargo, "%f" % 10 ** -3 produce '0.001000' que infringe la restricción "sin ceros finales".

No es difícil forzar una forma de evitar esto (reemplazo de regex o algo así), pero me pregunto si me falta algo de magia de cadena de formato.

Respuesta

7

Me parece un poco hacky, pero se puede utilizar str.rstrip("0") para deshacerse de ceros a la derecha:

>>> "{:f}".format(10**-6).rstrip("0") 
'0.000001' 
>>> "{:f}".format(10**-3).rstrip("0") 
'0.001' 

Editar: Como se ha dicho en los comentarios, hay una manera mejor para esto:

>>> format(1e-6, 'f').rstrip('0') 
'0.000001' 
>>> format(1e-3, 'f').rstrip('0') 
'0.001' 
+0

Eso es lo que el OP denominó * "fuerza bruta para evitar esto" *, por lo que no es una respuesta real (-1). Sin embargo, lo haría de esta manera también (+1). –

+0

+1. No es nada hacky. Tal vez el uso de la función 'format()' es un poco más limpio: 'formato (1e-6, 'f'). Rstrip ('0')'. –

+0

@Oben Sonne, pero es mucho mejor que usar regex. @Ferdinand Beyer, gracias, no lo sabía, modificando la respuesta. – utdemir

2

el simple rstrip("0") no maneja bien pequeños y algunos otros valores, se debe dejar un cero después del punto decimal - 0.0 en lugar de 0.:

def format_float(value, precision=-1): 
    if precision < 0: 
     f = "%f" % value 
    else: 
     f = "%.*f" % (precision, value) 

    p = f.partition(".") 

    s = "".join((p[0], p[1], p[2][0], p[2][1:].rstrip("0"))) 

    return s 

print(format_float(3e-10)) 
print(format_float(3e-10, 20)) 
print(format_float(1.5e-6)) 
print(format_float(1.5e+6)) 
Cuestiones relacionadas