2012-08-07 39 views
5

Tôi đang cố gắng sử dụng string.format trên phao 'nan'.Định dạng phao nano trong python

Dưới đây là mô tả về tùy chọn 'g' từ python documentation.

Định dạng chung. Điều này in số như một số điểm cố định, trừ khi số lượng quá lớn, trong trường hợp này nó chuyển sang ký hiệu số mũ 'e'. Giá trị vô cực và NaN được định dạng là inf, -inf và nan, tương ứng.

Và đây là những gì tôi nhận được cố gắng nó trong người phiên dịch (Python 2.6):

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

Như tôi hiểu các tài liệu, đầu ra phải là "nan".

Đây có phải là lỗi hoặc tôi đang làm sai?

+0

nền tảng gì và phiên bản Python bạn đang sử dụng? – ecatmur

+1

Windows 7 và Python phiên bản 2.6.6 (32 bit) – Chris

Trả lời

7

repr(float) đã được sửa trong Python 2.6 và Python 3.0; xem http://bugs.python.org/issue1635; tuy nhiên str.format không được cố định cho đến khi nhánh 2.7; xem http://hg.python.org/cpython/rev/c5e0d9beebf9http://bugs.python.org/issue1580.

Tôi khuyên bạn nên xem nếu "{0!r}" hoạt động cho bạn; rằng nên gọi vào mã không bị hỏng repr.

Nếu bạn cần sử dụng định dạng "{0:g}" spec, bạn có thể thử subclassing float và trọng __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

Tôi đang sử dụng Python 2.6. Bạn có quan tâm để phát triển câu trả lời của bạn nhiều hơn một chút không? – Chris

+0

Có phải 'Các phiên bản' được liệt kê trong báo cáo lỗi các phiên bản mà nó được phát hiện hoặc các phiên bản mà nó được sửa chữa không? Tôi nghi ngờ trước đây. Nó hoạt động với tôi trong 2.7. –

+0

@Chris có vẻ như 'str.format' là một bản sửa lỗi riêng biệt. – ecatmur

Các vấn đề liên quan