轉載:https://blog.csdn.net/jiangyu1013/article/details/52607257
JDK1.5開始String類中提供了一個非常有用的方法String.format(String format, Object ... args)
檢視源碼得知其實是調用了java.util.Formatter.format(String, Object...)方法
-
public static String format(String format, Object ... args) {
-
return new Formatter().format(format, args).toString();
-
}
String.format(String format, Object ... args) 這個方法最重要的的地方就是它的第一個參數String format,我們隻要掌握了這個參數的用法也就掌握了String.format的用法
首先來看一個列子
-
String s2 = String.format("%1$tY-%1$tm-%1$te", new Date());
-
System.out.println(s2);
這裡會列印出什麼内容?
先不急着去運作它,相信閱讀到後面不用運作,你也會知道的.
檢視JDK文檔得知,String.format方法的第一個參數是有個公式可以套的
%[argument_index$][flags][width][.precision]conversion
這裡我們隻要牢記這個公式就可以,下面說下每個顔色所代表的含義
argument_index: 可選,是一個十進制整數,用于表明參數在參數清單中的位置。第一個參數由 "1$" 引用,第二個參數由 "2$" 引用,依此類推。
flags: 可選,用來控制輸出格式
width: 可選,是一個正整數,表示輸出的最小長度
precision:可選,用來限定輸出字元數
conversion:必須,用來表示如何格式化參數的字元
先看一個簡單的列子:
System.out.println(String.format("我的名字叫%s", "小明")); // 列印:我的名字叫小明
這裡我們隻用了%s這個簡單的表達式,對比上面的公式,我們發現[argument_index$][flags][width][.precision]這些部分全部都省略掉了
隻留下一個必須的conversion,在這裡conversion就是"s",百分号%是固定不變的
[argument_index$]省略之後它會自動把"小明"這個值填入到%s中去
我再稍微改下列子:
String.format("我叫%s,她叫%s", "小明","小方"); // 我叫小明,她叫小方
這裡會按順序分别把小明,小方填入到對應的%s中. 如果我們要把小方填在前面,小明填在後面,那該怎麼做呢,[argument_index$]就派上用場了
String.format("我叫%2$s,她叫%1$s", "小明","小方"); // 我叫小方,她叫小明
依然是百分号%開頭,中間多了個2$,1$
conversion可以填s,那還有什麼其它字母可以填呢,當然有的比如
o:結果被格式化為八進制整數
x:結果被格式化為十六進制
d:結果被格式化為十進制整數
-
System.out.println(String.format("%o", 8)); // 10
-
System.out.println(String.format("%x", 16)); // 10
更多的conversion類别可以參考JDK文檔java.util.Formatter類
至此,我們已經了解了argument_index$和conversion的用處,接下來我們了解flag和width的用法
flag是用來控制輸出格式的,比如左對齊,金額用逗号隔開等
width:表示最小寬度
先看個列子:
String.format("%1$,d", 12302562); // 12,302,562
這裡多出一個逗号",",它就是flag,用于金額千分位隔開,當然寫成"%,d"也是可以的
再一個列子:
String.format("%1$08d", 123456);// 00123456
這裡0就是flag,表示結果将用零來填充,8就是width,表示最少要8位,d是conversion
至于其它的flag可以查閱JDK文檔
接下來說下[.precision]
這個單詞翻譯下是精度的意思,我們發現了前面有個小數點".",是以不難聯想到這個是關于浮點數類型的
隻有當傳入的資料是浮點數時這個才有用,整數或者日期類型的資料都不能用
比如我想要四舍五入保留兩位小數,那麼我可以這麼寫:
String.format("%1$.2f", 12.12555);// 12.13
這裡f表示傳入的數字是浮點型,如果傳入的是整數,或者把f改成d都會抛出異常,JDK文檔中有明确說明
對于浮點轉換 'e'、'E' 和 'f',精度是小數點分隔符後的位數。如果轉換是 'g' 或 'G',那麼精度是舍入計算後所得數值的所有位數。如果轉換是 'a' 或 'A',則不必指定精度。
對于字元、整數和日期/時間參數類型轉換,以及百分比和行分隔符轉換,精度是不适用的;如果提供精度,則會抛出異常。
到現在為止這套表達式公式已經基本講完了,這套公式是針對于基本資料類型,和字元串的,如果是正對于時間類型的資料該怎麼做呢,比如格式化日期
其實文檔中已經給出說明了:
用來表示日期和時間類型的格式說明符的文法如下:
%[argument_index$][flags][width]conversion
可選的 argument_index、flags 和 width 的定義同上。
所需的 conversion 是一個由兩字元組成的序列。第一個字元是 't' 或 'T'。第二個字元表明所使用的格式。這些字元類似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定義的字元。
需要注意的是conversion 是一個由兩字元組成的序列。第一個字元是 't' 或 'T'。
也就是說用conversion的時候首先必要寫一個"t",然後在寫其它conversion
時間類型有它自己的一套conversion,我們簡單的選擇幾個來說:
'Y' | 年份,被格式化為必要時帶前導零的四位數(至少),例如,0092 等于格裡高利曆的 92 CE。 |
'm' | 月份,被格式化為必要時帶前導零的兩位數,即 01 - 13。 |
'd' | 一個月中的天數,被格式化為必要時帶前導零兩位數,即 01 - 31 |
上面三個分别表示年月日
如果我要顯示年份,我就可以"%tY",顯示月份我就可以寫"%tm",記得一定要帶上"t"
那麼本篇一開始提到的那串複雜的表達式現在看來是不是很簡單呢:
-
String s2 = String.format("%1$tY-%1$tm-%1$te", new Date());
-
System.out.println(s2);
String.format()方法差不多講完了,仔細看JDK文檔也會慢慢了解的
需要批量進行格式化時,考慮下DateFormat, MessageFormat, NumberFormat 把他們封裝成一個靜态工具類或許更好
畢竟調用String.format()方法是會new一個Formatter對象,雖然有GC幫忙,但是平時程式設計的時候還是要考慮這些因素的
盡量少的建立對象,節省資源