JDK1.5開始String類中提供了一個很是有用的方法String.format(String format, Object ... args)java
查看源碼得知實際上是調用了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的用法。首先來看一個列子code
String s2 = String.format("%1$tY-%1$tm-%1$te", new Date()); System.out.println(s2);
這裏會打印出什麼內容?orm
先不急着去運行它,相信閱讀到後面不用運行,你也會知道的。ci
查看JDK文檔得知,String.format(String format, Object ... args)方法的format
是有個公式能夠套的。文檔
%[argument_index$][flags][width][.precision]conversion
其中方括號中的內容能夠省略,具體每一個公式的含義以下字符串
1$
引用,第二個參數由 2$
引用,依此類推。先看一個簡單的列子:源碼
System.out.println(String.format("個人名字叫%s", "小明")); // 打印:個人名字叫小明
這裏咱們只用了%s這個簡單的表達式,對比上面的公式,咱們發現[argument_index$][flags][width][.precision]這些部分所有都省略掉了io
只留下一個必須的conversion
,在這裏conversion就是"s",百分號%是固定不變的。form
[argument_index$]省略以後它會自動把"小明"這個值填入到%s中去
咱們再稍微改下列子:
String.format("我叫%s,她叫%s", "小明","小方"); // 我叫小明,她叫小方
這裏會按順序分別把小明,小方填入到對應的%s中。
conversion能夠填s
,那還有什麼其它字母能夠填呢,固然有的好比
System.out.println(String.format("%o", 8)); // 10 System.out.println(String.format("%x", 16)); // 10
更多的conversion類別能夠參考JDK文檔java.util.Formatter類。
接着上面的例子,若是咱們要把小方填在前面,小明填在後面,那該怎麼作呢,[argument_index$]
就派上用場了
String.format("我叫%2$s,她叫%1$s", "小明","小方"); // 我叫小方,她叫小明
依然是百分號%開頭,中間多了個2$
,1$
,即把「小明」這個值放到1$
所在的位置,「小方」放在2$
所在的位置。
至此,咱們已經瞭解了argument_index$
和conversion
的用處,接下來咱們瞭解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文檔中有明確說明。
到如今爲止這套表達式公式已經基本講完了,這套公式是針對於基本數據類型,和字符串的,若是是正對於時間類型的數據該怎麼作呢,好比格式化日期。
其實文檔中已經給出說明了,用來表示日期和時間類型的格式說明符的語法以下:
%[argument_index$][flags][width]conversion
可選的 argument_index
、flags
和 width
的定義同上。
所需的conversion
是一個由兩字符組成的序列。第一個字符是 't' 或 'T'。第二個字符代表所使用的格式。這些字符相似於但不徹底等同於那些由 GNU date 和 POSIX strftime(3c) 定義的字符。
須要注意的是conversion
是一個由兩字符組成的序列。第一個字符是 't' 或 'T'
也就是說用conversion的時候首先必要寫一個t
,而後在寫其它conversion
時間類型有它本身的一套conversion,咱們簡單的選擇幾個來講:
上面三個分別表示年月日
若是我要顯示年份,我就能夠%tY
,顯示月份我就能夠寫%tm
,記得必定要帶上t
那麼本篇一開始提到的那串複雜的表達式如今看來是否是很簡單呢:
String s2 = String.format("%1$tY-%1$tm-%1$te", new Date()); System.out.println(s2);
本篇講解了String.format()
的用法,重點在於瞭解format參數表達式的做用,更多的使用方式可參閱JDK文檔。