2012-05-08 8 views
8

Si tengo por ejemplo x = 40 Quiero que el siguiente resultado:Python interpolación de cadenas: sólo muestran cifras decimales necesarios

40" 

Para x = 2,5 el resultado debe ser como ...

2.5" 

Así que básicamente quiero formatear a un decimal como máximo. Actualmente utilizo esto:

"{0:0.1f}\"".format(x, 1) 

Pero esto siempre muestra exactamente una cifra decimal, que no es realmente lo que quiero ...

+0

¿Qué debería pasar con -0.05? –

+0

¿Desea redondear o truncar los dígitos finales? – prelic

Respuesta

9

Una opción es algo así como

"{0}\"".format(str(round(x, 1) if x % 1 else int(x))) 

que mostrará x como un entero si no hay una parte fraccionaria. Posiblemente hay una mejor manera de hacerlo.

+0

¡Muchas gracias! :) – dom0

+0

No hay problema :) Me alegro de que ayude. Aunque es curioso ver si alguien más tiene una manera más clara de hacerlo. –

+0

¿Para qué sirve el 2º formato arg to '(...)'? (aquí: 1) – lajarre

3

solución Tal vez no necesariamente completamente limpio, pero creo que al menos un poco más explícito:

"{1:0.{0}f}\"".format(int(not float(x).is_integer()), x) 

que puede ser sustituida con más críptica (basado en Michael Mior idea de redondeo):

"{1:0.{0}f}\"".format(int(x % 1 > 0), x) 

si prefiere expresiones más cortas (aunque menos pitónicas).

+0

Por una vez veo la utilidad real de 'format'. Y la segunda versión es superior a mí (limpiador) – lajarre

4

Este es reutilizable, se puede utilizar en str, float, o int, y convertirá ''-0:

def minimalNumber(x): 
    if type(x) is str: 
     if x == '': 
      x = 0 
    f = float(x) 
    if f.is_integer(): 
     return int(f) 
    else: 
     return f 

uso con:

print "{}\"".format(minimalNumber(x)) 

Ejemplo:

x = 2.2 
print "{}\"".format(minimalNumber(x)) 
x = 2.0 
print "{}\"".format(minimalNumber(x)) 

que salidas:

2.2" 
2" 
+1

Es posible que desee usar 'float (x) .is_integer()' para permitir el uso de enteros. ('is_integer' no está definido para enteros) –

+0

De acuerdo. Gracias. –

Cuestiones relacionadas