2018最新布林教育php大獅班全套教程 附帶課件
前面介紹了字串變數的四種賦值方式,對於簡單的賦值來說完全夠用了,即便是兩個字串拼接,也只需通過加號把兩個目標串連起來即可。但對於複雜的賦值來說就麻煩了,假設現在需要拼接一個很長的字串,字串內部包含了各種型別的變數,有整型,有雙精度型,有布林型,有字元型,中間還夾雜著一些起粘合作用的子串,如此一來只能使勁地填寫加號,把各種變數努力加加加加上去,就像有時列印日誌呼叫System.out.println就非常痛苦,加號多到讓你眼花繚亂。
為了不讓加號如此橫行霸道,String型別從Java5開始,額外提供了format方法對填入字串的各種變數進行格式化。具體地說,是在一個模板字串中填寫類似“%s”、“%d”、“%f”這樣的記號先佔幾個位置,然後給format方法的輸入引數分別指定對應位置的變數名稱,表示這些變數值依次替換模板中的“%s”、“%d”、“%f”等等記號。以上模板串用到的佔位記號也叫做格式轉換符,分別說明如下:
%s : 這是字串的佔位記號,可原樣展示字串如"Hello"。
%c : 這是字元的佔位記號,可原樣展示字元如'A'。
%b : 這是布林值的佔位記號,可原樣展示true或者false。
%d : 這是十進位制整數(含位元組型、短整型、整型、長整型)的佔位記號,可原樣展示十進位制數如255。
%o : 這是八進位制整數的佔位記號,填寫十進位制數,格式化後會轉換成八進位制數。例如,輸入整數255會輸出八進位制數377。
%x : 這是十六進位制整數的佔位記號,填寫十進位制數,格式化後會轉換成十六進位制數。例如,輸入整數255會輸出十六進位制數ff。
%f : 這是浮點數的佔位記號,格式化後會轉換成七位小數(整數部分與小數部分加起來)。
下面是利用format方法格式化單個變數值與多個變數值的程式碼例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
+fromChar);
, 255 );
|
觀察上面的程式碼,可見大部分的基本型別都支援格式化,除了雙精度型。如果雙精度數的精度剛好在浮點數範圍之內,還能借助標記%f來格式化,要是雙精度數超過了浮點數的精度,還能使用%f格式化嗎?接下來通過以下的測試程式碼,看看3.1415926這個雙精度數會被%f格式化成什麼樣子:
1 2 3 |
|
執行以上的測試程式碼,列印的日誌結果如下所示:
1 |
|
可見使用%f格式化雙精度數,超出範圍的小數部分被強行四捨五入了,因而%f並不適合用於直接格式化雙精度型。若想讓雙精度數在格式化時不損失精度,需要程式設計師指定小數點後面的保留位數,比如%.8f表示格式化時保留八位小數部分,f前面的數字越大代表保留的位數越多,雙精度數的數值精度就越高。利用%.8f改寫之前的雙精度數格式化程式碼,改寫後的演示程式碼如下:
1 2 3 |
|
執行如上的演示程式碼,程式執行結果如下所示:
1 |
|
從日誌資訊可見,此時雙精度數的小數部分得以完整地儲存了下來。
所謂的格式化,不單單是按照標記填寫具體數值,還要求字串格式整齊劃一。譬如統計世界各國人口,列表中的各國人口數值應當右對齊,這樣誰多誰少方能一目瞭然。既然要求支援對齊,那麼得先明確該列數字的最大位數,之後才能在位數範圍內選擇左對齊還是右對齊。整數部分最大位數的標記方式與小數部分的保留位數類似,唯一的區別是整數位數的標記不加點號,而小數位數的標記要加點號,例如%8d表示待格式化的整數將佔據八個字元空間,並且預設右對齊、左補空格。倘若要求左對齊,則格式化標記需新增符號,像%-8d表示待格式化的整數在八位空間內左對齊,並且右補空格。有時候數字代表一串編碼,即使未達到最大位數也得在左邊補0,此時格式化標記要在位數前面補充0,代表空出來的位置填0而不是填空格,如標記%08d表示待格式化的整數要求右對齊、左補0。下面是對整數位數進行各種格式化的程式碼例子:
1 2 3 4 5 6 7 8 9 |
|
執行上述的格式化程式碼,得到下列的日誌列印結果:
1 2 3 |
|
由此可見,格式化後的數字既實現了右對齊,也實現了左對齊,還支援在空位補0。
一旦格式化用得多了,便會出現某個變數需要多次填入的情況,比如說“重要的事情說三遍”,後面的句子就得輸入三次,像以下程式碼所示的那樣,“別遲到”三字反覆寫了三次:
1 2 3 |
|
這種做法無疑非常拖沓,不但寫起來費勁,看起來也費神。為此格式化又設計了形如“%n$s”的標記,其中n表示當前標記取的是第幾個引數值,尾巴的s就是普通的格式化標記,中間的美元符號$把兩者隔開。例如標記%1$s表示當前要取第一個引數,且該引數型別為字串,於是前述的“重要的事情說三遍”即可簡化為以下程式碼:
1 2 3 |
|
現在有個比較常見的業務要求,金額數字通常都要保留小數點後面兩位,像餘額寶的每日收益就精確到小數點後兩位的單位分。此時採取標記%.2f即可實現要求,但是餘額寶內部對賬可不能僅僅保留兩位小數,一般至少保留小數點後三位的單位釐,那麼對賬用的格式化標記就變成了%.3f。這樣有的場合要求更高精度,有的場合精度要求不高,意味著標記%.nf中間的n值是隨時變化著的。若要處理變化的輸入數值,必須通過方法實現相關功能,也就是需要設計一個新方法,該方法的輸入引數包括待格式化的數字,以及需要保留的小數位數,方法的返回值為擷取指定小數位的字串。
對於雙精度數字來說,此時要先根據小數位數構建一個形如%.nf的格式化標記串,再依據該標記格式化最終的數值字串。由於百分號%是格式化的保留字元,因此要用兩個百分號%%來表達一個百分符號%,於是雙精度數的小數位數格式化程式碼書寫如下:
1 2 3 4 5 6 7 8 |
|
對於大小數型別而言,BigDecimal提供了專門的setScale方法,該方法不但允許指定擷取的小數位,還支援設定特定的舍入規則,當然通常情況使用RoundingMode.HALF_UP代表四捨五入即可。下面便是擷取大小數的方法程式碼例子:
1 2 3 4 5 6 |
|
接下來外部分別呼叫上面的雙精度數格式化方法formatWithDouble,以及大小數格式化方法formatWithBigDecimal,具體的測試呼叫程式碼如下所示:
1 2 3 4 5 6 7 8 |
|
執行上述的精度格式化程式碼,輸出以下的日誌列印資訊:
1 2 |
|
可見不管是雙精度格式化,還是大小數格式化,都實現了四捨五入保留兩位小數的目標。