2012-08-07 18 views
5

Ich versuche, string.format auf einem 'nan' Float zu verwenden.Formatieren eines nan float in Python

Hier ist die Beschreibung der "g" -Option von der python documentation.

Allgemeines Format. Dadurch wird die Zahl als Festkommazahl ausgegeben, es sei denn, die Zahl ist zu groß. In diesem Fall wird in die Exponentenschreibweise "e" umgeschaltet. Infinity- und NaN-Werte werden als inf, -inf und nan formatiert.

Und hier ist, was ich es in den Interpreter bekommen versuchen (Python 2.6):

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

Wie ich in der Dokumentation zu verstehen, sollte der Ausgang "nan" sein.

Ist das ein Fehler oder mache ich es falsch?

+0

Welche Plattform und welche Version von Python verwenden Sie? – ecatmur

+1

Plattform Windows 7 und Python v. 2.6.6 (32-Bit) – Chris

Antwort

7

repr(float) wurde in Python 2.6 und Python 3.0 behoben; siehe http://bugs.python.org/issue1635; jedoch str.format wurde nicht bis zum 2.7-Zweig behoben; siehe http://hg.python.org/cpython/rev/c5e0d9beebf9 und http://bugs.python.org/issue1580.

Ich würde empfehlen zu sehen, ob "{0!r}" für Sie arbeitet; dass sollte Anruf in den nicht gebrochenen repr Code.

Wenn Sie "{0:g}" Format-Spezifikation verwenden müssen, könnten Sie versuchen, Subklassen float und überwiegendes __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

Ich benutze Python 2.6. Möchten Sie Ihre Antwort ein wenig mehr entwickeln? – Chris

+0

Sind die im Fehler aufgelisteten "Versionen" die Versionen, in denen sie entdeckt wurde, oder die Versionen, in denen sie behoben wurde? Ich vermute ersteres. Es funktioniert für mich in 2.7. –

+0

@Chris sieht aus wie 'str.format' war ein separater Fix. – ecatmur