2012-08-07 15 views
5

Estoy tratando de usar string.format en un flotante 'nan'.Formateando un flotador nan en python

Aquí está la descripción de la opción 'g' del python documentation.

Formato general. Esto imprime el número como un número de punto fijo, a menos que el número sea demasiado grande, en cuyo caso cambia a la notación del exponente 'e'. Los valores de Infinity y NaN se formatean como inf, -inf y nan, respectivamente.

Y aquí es lo que consigo probarlo en el intérprete (Python 2.6):

>>> print "{0:g}".format(float('nan')) 
-1.#IND 

Según entiendo la documentación, la salida debe ser "nan".

¿Esto es un error o lo estoy haciendo mal?

+0

Qué plataforma y la versión de Python está usando? – ecatmur

+1

Plataforma Windows 7 y Python v. 2.6.6 (32 bits) – Chris

Respuesta

7

repr(float) se corrigió en Python 2.6 y Python 3.0; ver http://bugs.python.org/issue1635; sin embargo, str.format no se corrigió hasta la rama 2.7; ver http://hg.python.org/cpython/rev/c5e0d9beebf9 y http://bugs.python.org/issue1580.

Recomiendo ver si "{0!r}" es adecuado para usted; que debe llamar al código repr no roto.

Si es necesario utilizar especificaciones "{0:g}" formato, puede probar con la subclasificación float y primordial __format__:

class FixFloat(float): 
    def __format__(self, format_spec): 
     return 'nan' if math.isnan(self) else float.__format__(self, format_spec) 

"{0:g}".format(FixFloat(1.2345e9)) 
'1.2345e+09' 
"{0:g}".format(FixFloat(float('nan'))) 
'nan' 
+0

Estoy usando Python 2.6. ¿Te importaría desarrollar tu respuesta un poco más? – Chris

+0

¿Las 'Versiones' que figuran en el informe de error son las versiones donde se descubrió, o las versiones donde se arregló? Sospecho que el primero. Funciona para mí en 2.7. –

+0

@Chris parece que 'str.format' era una solución aparte. – ecatmur