讀古今文學網 > 父與子的編程之旅:與小卡特一起學Python > 21.4 數字格式化 >

21.4 數字格式化

打印數字時,我們希望對數字如何顯示有一些控制:

  • 顯示多少位小數;

  • 使用常規記法還是 E 記法;

  • 是否增加前導或末尾的 0;

  • 是否在數字前面顯示正負號(+ 或 -)。

利用格式字符串,Python 為我們提供了充分的靈活性,不僅可以完成這些工作,甚至還可以做更多事情!

例如,如果你在使用一個天氣預報程序,你想看到下面哪一個結果呢?是這樣:

Today\'s High: 72.45672132, Low 45.4985756  

還是這樣:

Today\'s High: 72, Low: 45  

適當地顯示數字對很多程序來說都很重要。

下面先來看一個例子。假設我們想要打印一個有兩位小數的浮點數。試著在交互模式中執行以下命令:

>>> dec_number = 12.3456>>> print \'It is %.2f degrees today.\' % dec_numberIt is 12.35 degrees today  

print 語句中間包含一個格式字符串。不過這一次沒有直接使用 %f,而是使用了 %.2f。這就告訴 Python 要採用浮點數格式,而且小數點後面要顯示兩位。(注意,Python 非常聰明,它會正確地把數字四捨五入為兩位小數,而不是直接去掉多餘的數位。)

這個字符串後面,第二個 % 字符告訴 Python 接下來就是要打印的數。這個數要採用格式字符串中描述的格式來打印。再看幾個例子就能明白了。

你的記性不錯,卡特! % 符號確實用作取余操作符(整數除法中求餘數),這是我們在第 3 章中學過的,不過它也用於指示格式字符串。Python 能夠區分出你是指取余還是格式字符串。

整數:%d%i

要把某項內容打印成整數,可以使用 %d%i 格式字符串。(我不知道為什麼會有兩個,不過用哪個都可以。)

>>> number = 12.67>>> print \'%i\' % number12  

注意,這一次數字沒有四捨五入。它被截斷(truncated,表示「直接切斷」)了。如果是四捨五入,我們會看到 13 而不是 12。使用整數格式化時,數字會被截斷,不過使用浮點數格式化時,數字則會四捨五入。

這裡要注意以下 3 個方面。

  • 字符串中不要求有其他文本,可以只包含格式字符串。

  • 即使是浮點數,也可以把它打印為整數。這可以通過格式字符串實現。

  • Python 會把值截斷為上一個最大整數1。不過,這與 int 函數(在第 4 章見過)不同,因為格式字符串不會像 int 那樣創建一個新的值,而只是改變值顯示的方式。

1原文這裡是「下一個最小整數」,這是不對的。例如,13.2 會截斷為 13,也就是上一個最大整數,而下一個最小整數應當是 14,13.2 當然不會截斷為 14。——譯者注

剛剛我們用整數格式打印 12.67,結果 Python 打印出了 12。不過變量 number 的值並沒有改變。可以檢查一下:

>>> print number12.67  

number 的值並沒有改變。我們只是使用格式字符串採用不同的方式打印。

浮點數:%f%F

打印小數時,可以在格式字符串中使用大寫或小寫的 f(%f%F):

>>> number = 12.3456>>> print \'%f\' % number12.345600  

如果只使用 %f,數字會顯示為有 6 位小數。如果在 f 前面加上 .n,這裡 n 可以是任意整數,就會把數字四捨五入為指定的小數位數:

>>> print \'%.2F\' % number12.35  

可以看到它把數字 12.3456 四捨五入到小數點後前兩位:12.35。

如果指定的小數位比數中實際的小數位還要多,Python 會用 0 來填充(pad):

>>> print \'%.8f\' % number12.34560000  

這個數的小數點後面只有 4 位,但我們要求有 8 位小數,所以另外 4 位會用 0 來填充。

如果是負數,%f 總會顯示 -號。如果希望數字總會顯示正負號(即使它是一個正數),可以在 % 後面加一個 + 號(如果列表中既有正數也有負數,這對於列表的對齊也很有好處):

>>> print \'%+f\' % number+12.345600  

如果希望包含正負數的列表對齊,但是不希望看到正數帶 + 號,可以在 % 後面使用一個空格代替 +:

>>> number2 = -98.76>>> print \'% .2f\' % number2-98.76>>> print \'% .2f\' % number 12.35 

輸出中的 12 前面有一個空格,所以,儘管 98 前面有負號而 12 前面沒有正負號,這兩個數也能對齊。

E 記法:%e%E

我們在第 3 章討論過 E 記法,前面說過我會告訴你如何使用 E 記法來打印數字。好吧,現在就來介紹這個內容。

>>> number = 12.3456>>> print \'%e\' % number1.234560e+01  

要使用 %e 格式字符串打印 E 記法。它總是打印 6 位小數,除非你另作要求。

如果要打印更多或更少的小數位,可以在 % 後面使用 .n,就像打印浮點數時一樣:

>>> number = 12.3456>>> print \'%.3e\' % number1.235e+01>>> print \'%.8e\' % number1.23456000e+01  

%.3e 四捨五入為 3 位小數,%.8e 增加了一些 0 來填充不足的小數位。

小寫或大寫 e 都是可以的,你在格式字符串中使用什麼大小寫形式,輸出時也會顯示同樣的大小寫:

>>> print \'%E\' % number1.234560E+01  

自動浮點數或 E 記法:%g%G

如果你希望 Python 自動選擇浮點數記法或 E 記法,可以使用 %g 格式字符串。同樣,如果使用大寫,輸出中就會得到一個大寫的 E:

>>> number1 = 12.3>>> number2 = 456712345.6>>> print \'%g\' % number112.3>>> print \'%g\' % number24.56712e+08  

注意到了嗎? Python 會為大數自動選擇 E 記法,而對較小的數使用浮點數記法。

如何打印百分號

你可能很想知道,既然百分號(%)對格式字符串來說是一個特殊的字符,那麼怎麼打印 % 呢?

嗯,Python 有時候很聰明,它能確定你什麼時候使用 % 符號開始一個格式字符串,以及什麼時候只是想打印一個百分號。可以試試這個命令:

>>> print \'I got 90% on my math test!\'I got 90% on my math test!  

在這個例子中,字符串外面沒有第二個 %,也沒有需要格式化的變量,所以 Python 認為這個 % 只是字符串中的一個普通字符。

但是如果你在打印格式化字符串時想打印一個百分號,就需要輸入兩個百分號,就像你曾經用兩個反斜線來打印一個反斜線一樣。我們說第一個百分號對第二個百分號進行了轉義,就像在本章前面的術語箱中提到的一樣:

>>> math = 75.4>>> print \'I got %.1f%% on my math test\' % mathI got 75.4% on my math test  

第一個 % 表示格式化字符串。兩個 %% 在一起告訴 Python,你希望打印出一個 % 字符。引號外面的 % 告訴 Python 你需要將後面的變量打印出來。

多個格式化字符串

如果你想在一個 print 語句中放入多個格式化字符串,該怎麼辦呢?你可以這樣做:

>>> math = 75.4>>> science = 82.1>>> print \'I got %.1f in math and %.1f in science\' % (math, science)  

你可以在 print 語句中放入任意多個格式化字符串,後面跟一個變量元組(tuple)。還記得嗎?元組和列表很像,只是它使用的是圓括號而不是方括號,而且元組是不可變的。這是 Python 顯得很挑剔的一個地方,這裡你必須使用元組,而不能使用列表。除非只有一個變量需要格式化,這時才可以不用元組。(你在很多例子中已經見過了。)請確保(引號內的)格式化字符串的數量和(引號外的)變量數量相同,否則程序會報錯。

存儲格式化數字

有時你不想直接打印出格式化的數字,而是希望把它存儲在一個字符串中以備以後使用。這很容易,可以不打印,把它直接賦給一個變量,如下:

>>> my_string = \'%.2f\' % 12.3456>>> print my_string12.35>>> print \'The answer is\', my_stringThe answer is 12.35  

這裡沒有直接打印格式化數字,我們把它賦給變量 my_string。再將 my_string 與其他一些文本結合,並打印整個句子。

對於 GUI 和其他圖形程序(如遊戲)來說,將格式化數字存儲為字符串非常有用。一旦有一個對應格式化字符串的變量名,就可以採用你希望的任何方式來顯示:可以顯示在文本框中,顯示在對話框中,或者顯示在遊戲屏幕上。