2014-10-03 94 views
0

我意識到這個問題可以理解爲類似於別人,所以我開始之前,這裏是一些可能的「重複」列表中每個人都開始指向之前出。這些似乎都沒有正確回答我的問題。Python字符串格式化{:d} VS%d的浮點數

我的問題特別涉及使用用於顯示的整數的string.format()方法。

使用%字符串中的解釋執行Python格式化運行下面的代碼2.7

>>> print "%d" %(1.2345) 
    1 

而使用在string.format()方法結果如下

>>> print "{:d}".format(1.2345) 
    Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
    ValueError: Unknown format code 'd' for object type 'float' 

我期待在這兩個相同的行爲;讓解釋器在顯示之前將我的浮點數實際轉換爲整數。我意識到我可以使用int函數將浮點數轉換爲整數格式,但我正在尋找與%d格式化方法相同的功能。有沒有任何string.format()方法可以爲我做到這一點?

+0

如果你不知道你的變量是否是一個整數,那麼不僅要明確地進行轉換,這是什麼原因?例如'print'{:d}「。format(int(1.2345))' – 2014-10-03 09:39:23

+0

@Tom,正如我所說的,我可以自己完成轉換,所有的麻煩都會消失。但是我真正想知道的是,爲什麼兩種乍看之下非常相似的方法並沒有完全一樣。 – Mike 2014-10-03 09:45:17

回答

8

兩個實現是相當獨立的,並在%執行一些疣冰釋前嫌。對於花車使用%d可能掩蓋在你的代碼,你以爲你有整數,但得到的浮點值而不是問題。想象的1.999999的值,並且只看到1而不是2作爲%d截斷值。

因此,str.format()調用的float.__format__()掛接方法執行實際的轉換工作時不支持d格式,而是拋出異常。

可以使用{:.0f}格式不帶小數的數字顯示明確(四捨五入)浮點值:

>>> '{:.0f}'.format(1.234) 
'1' 
>>> '{:.0f}'.format(1.534) 
'2' 

或格式化明確截斷之前你的浮點數使用int()

作爲一個側面說明,如果你正在做的是格式化數字作爲一個字符串(而不是插值成一個較大的字符串),使用format() function

>>> format(1.234, '.0f') 
'1' 

這傳達你的意圖更好,啓動要快一點。

+0

謝謝,很好的解釋!這就是我真正的追求。 +1 – Mike 2014-10-03 09:42:45

0

有關於「自動類型轉換」(脅迫)2.7和3.0之間的一個重要的變化。雖然2.7在某種程度上相對「放鬆」,但3.0強迫你更加自律。

自動轉換可能是危險的,因爲它可能會默默地截斷/減少一些數據!此外,這種行爲是不一致的,你永遠不知道會發生什麼;直到你面臨他的問題。 Python 3.0要求你指定你想要的,確切地說,做!

但是,新的string.format()添加了一些非常強大和有用的格式化技術。 「免費」格式「{}」甚至非常清楚。像這樣:

'{}'.format(234) 
'{:10}.format(234) 
'{:<10}'.format(234) 

請參閱?我不需要指定'整數','浮動'或其他任何東西。這將適用於任何類型的值。

for v in (234, 1.234, 'toto'): 
    for fmt in ('[{}]', '[{:10}]', '[{:<10d}]', '[{:>10d}]'): 
     print(fmt.format(v)) 

此外,%值已過時,不應再使用。新的string.format()比舊的格式化技術更易於使用並且具有更多功能。其中,恕我直言,使舊技術不那麼吸引人。