2010-03-05 15 views
42

¿Cuál es una buena forma de formatear un decimal de python de esta manera?Formato de decimales de Python

1.00 -> '1'
1.20 -> '1,2'
1.23 -> '1,23'
1.234 -> '1,23'
1,2345 -> '1,23'

+1

Al convertir a una cadena? –

+0

Sí, convirtiendo a una cadena. – juanefren

+1

Si está utilizando Decimal y no flota, es posible que también desee consultar http://stackoverflow.com/questions/11227620/drop-trailing-zeros-from-decimal. '{: g}' no corta los ceros insignificantes de los decimales. – Pankrat

Respuesta

80

Si tiene Python 2.6 o posterior, utilice format:

'{0:.3g}'.format(num) 

Para Python 2.5 o más:

'%.3g'%(num) 

Explicación:

{0} dice format para imprimir el primer argumento - - en este caso, num.

Todo después de los dos puntos (:) especifica format_spec.

.3 establece la precisión de 3.

g elimina ceros no significativos. Ver http://en.wikipedia.org/wiki/Printf#fprintf

Por ejemplo:

tests=[(1.00, '1'), 
     (1.2, '1.2'), 
     (1.23, '1.23'), 
     (1.234, '1.23'), 
     (1.2345, '1.23')] 

for num, answer in tests: 
    result = '{0:.3g}'.format(num) 
    if result != answer: 
     print('Error: {0} --> {1} != {2}'.format(num, result, answer)) 
     exit() 
    else: 
     print('{0} --> {1}'.format(num,result)) 

produce

1.0 --> 1 
1.2 --> 1.2 
1.23 --> 1.23 
1.234 --> 1.23 
1.2345 --> 1.23 
+14

Parece que esto hace que Python 2.7 entre en la notación científica para números más grandes: >>> "{0: .3g}". Format (100.20) '100' >>> "{0: .3g}" .format (1001.20) '1e + 03' – vdboor

+3

Entonces, cómo configurar no 'Notación de exponente'. Como dosis '{:, 2f} .format (number)', pero también elimina ceros insignificantes –

3

sólo tiene que utilizar norma string formatting methods de Python:

>>> "{0:.2}".format(1.234232) 
'1.2' 
>>> "{0:.3}".format(1.234232) 
'1.23' 

Si está utilizando una versión de Python bajo 2.6, utilice

>>> "%f" % 1.32423 
'1.324230' 
>>> "%.2f" % 1.32423 
'1.32' 
>>> "%d" % 1.32423 
'1' 
+1

Esta no es una solución general y no funcionará para números con ceros al final. –

9

Aquí es una función que hará el truco:

def myformat(x): 
    return ('%.2f' % x).rstrip('0').rstrip('.') 

Y aquí están los ejemplos:

>>> myformat(1.00) 
'1' 
>>> myformat(1.20) 
'1.2' 
>>> myformat(1.23) 
'1.23' 
>>> myformat(1.234) 
'1.23' 
>>> myformat(1.2345) 
'1.23' 

Editar:

De su análisis de las respuestas de otras personas y la experimentación, Descubrí que g hace todas las cosas necesarias para ti. Así,

'%.3g' % x 

funciona espléndidamente también y es un poco diferente de lo que otras personas están sugiriendo (usando '{0: 0.3}' formato (cosas).). Supongo que elige tu elección.

+0

Agradable. Mucho más limpio que el mío –

+3

Cuando obtienes algo como 0.0000005 aunque creo que '% .3g'% x comenzará a darte exponentes? – PriceChild

18

Sólo primera parte de la respuesta de Justin es correcta. Usar "% .3g" no funcionará para todos los casos, ya que .3 no es la precisión, sino el número total de dígitos. Pruébalo para números como 1000.123 y se rompe.

Por lo tanto, me gustaría utilizar lo que Justin está sugiriendo:

>>> ('%.4f' % 12340.123456).rstrip('0').rstrip('.') 
'12340.1235' 
>>> ('%.4f' % -400).rstrip('0').rstrip('.') 
'-400' 
>>> ('%.4f' % 0).rstrip('0').rstrip('.') 
'0' 
>>> ('%.4f' % .1).rstrip('0').rstrip('.') 
'0.1' 
Cuestiones relacionadas