2012-08-07 13 views
5

Próbuję użyć string.format na float 'nan'.Formatowanie nanowłókniny w pytonie

Oto opis opcji „g” z python documentation.

Format ogólne. Spowoduje to wypisanie liczby jako numeru stałego, chyba że liczba jest zbyt duża, w takim przypadku przełącza się na notację wykładniczą "e". Wartości Infinity i NaN są odpowiednio sformatowane jako inf, -inf i nan.

A oto co się próbuje ją w tłumacza (Python 2.6):

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

Jak rozumiem dokumentację, wyjście powinno być "nan".

Czy to błąd, czy robię to źle?

+0

jakiej platformy i która wersja Pythona używasz? – ecatmur

+1

Platforma Windows 7 i Python v. 2.6.6 (32-bit) – Chris

Odpowiedz

7

repr(float) przymocowano Pythonie 2,6 Python 3,0; patrz http://bugs.python.org/issue1635; jednak str.format nie został naprawiony do gałęzi 2.7; patrz http://hg.python.org/cpython/rev/c5e0d9beebf9 i http://bugs.python.org/issue1580.

Polecam zobaczyć, czy "{0!r}" działa dla Ciebie; to powinno być zadzwonić pod niezłamany kod repr.

Jeśli trzeba użyć formatu "{0:g}" specyfikację, można spróbować instacji float i przesłanianie __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

Używam Python 2.6. Czy chciałbyś rozwinąć swoją odpowiedź trochę bardziej? – Chris

+0

Czy "Wersje" wymienione w raporcie o błędach wersji, w których zostały odkryte, czy wersje, w których zostały naprawione? Podejrzewam tę pierwszą. Działa dla mnie w 2.7. –

+0

@ Chodzi o to, że 'str.format' był osobną poprawką. – ecatmur