2013-02-21 114 views
16

我想格式化浮點數的列表,最多隻能輸入2位小數。但是,我不想跟蹤零,也不想跟蹤小數點。大多數Pythonic打印方式*最多*小數位數

因此,舉例來說,4.001 =>44.797 =>4.88.992 =>8.9913.577 =>13.58

簡單的解決方案是('%.2f' % f).rstrip('.0')('%.2f' % f).rstrip('0').rstrip('.')。但是,這看起來相當醜陋,而且看起來很脆弱。任何更好的解決方案,也許有一些神奇的格式標誌?

+0

我錯過了點這裏,或者怎麼樣'輪()'函數:HTTP://文檔。 python.org/2/2/library/functions.html#round – TerryA 2013-02-21 08:43:00

+0

雖然,我不得不說,我不是一個涉及'round'的解決方案的狂熱粉絲,因爲我很緊張,我會把'1.1000000000009962'作爲一個輸出有一天。 – nneonneo 2013-02-21 08:43:57

+4

Aarrgh,它不是重複的!我不想跟隨'.0'。另一個問題允許。 – nneonneo 2013-02-21 08:47:00

回答

15

您需要分離0.剝離;這樣你就不會剝奪自然0

或者,使用format()功能,但是這真的可以歸結爲同一件事:

format(f, '.2f').rstrip('0').rstrip('.') 

一些測試:

>>> def formatted(f): return format(f, '.2f').rstrip('0').rstrip('.') 
... 
>>> formatted(0.0) 
'0' 
>>> formatted(4.797) 
'4.8' 
>>> formatted(4.001) 
'4' 
>>> formatted(13.577) 
'13.58' 
>>> formatted(0.000000000000000000001) 
'0' 
>>> formatted(10000000000) 
'10000000000' 
+0

+1:我想這是我獨立完成的結論。我希望有一個更好的解決方案,但可能沒有一個。謝謝! – nneonneo 2013-02-21 11:44:42

13

g格式化輸出限制爲n顯著位,下探尾隨零:

>>> "{:.3g}".format(1.234) 
'1.23' 
>>> "{:.3g}".format(1.2) 
'1.2' 
>>> "{:.3g}".format(1) 
'1' 
+2

如果您只有一個模板,則可以使用['format()'function](http://docs.python.org/2/library/functions.html#format)。例如'格式(f,'.3g')'。這甚至適用於0。 – 2013-02-21 11:32:39

+3

幾乎...除了打印*最多三位數字*,而不是*最多兩位小數*。 (例如:''{:.3g}'.format(13.468)'打印'13.5'而不是'13.47') – nneonneo 2013-02-21 11:34:41

+1

啊,當涉及到指數時,它也會做錯誤的事情。 – 2013-02-21 11:36:47

5

一般來說,使用String [s]可能會很慢。 然而,這是另一種解決方案:

>>> from decimal import Decimal 
>>> precision = Decimal('.00') 
>>> Decimal('4.001').quantize(precision).normalize() 
Decimal('4') 
>>> Decimal('4.797').quantize(precision).normalize() 
Decimal('4.8') 
>>> Decimal('8.992').quantize(precision).normalize() 
Decimal('8.99') 
>>> Decimal('13.577').quantize(precision).normalize() 
Decimal('13.58') 

您可以在這裏找到更多的信息:http://docs.python.org/2/library/decimal.html