String.format()方法詳解

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

其中方括號中的內容能夠省略,具體每一個公式的含義以下字符串

  • argument_index:可選,是一個十進制整數,用於代表參數在參數列表中的位置。第一個參數由 1$ 引用,第二個參數由 2$ 引用,依此類推。
  • flags: 可選,用來控制輸出格式
  • width: 可選,是一個正整數,表示輸出的最小長度
  • precision: 可選,用來限定輸出字符數
  • conversion: 必須,用來表示如何格式化參數的字符

conversion

先看一個簡單的列子:源碼

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,那還有什麼其它字母能夠填呢,固然有的好比

  • 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

接着上面的例子,若是咱們要把小方填在前面,小明填在後面,那該怎麼作呢,[argument_index$]就派上用場了

String.format("我叫%2$s,她叫%1$s", "小明","小方"); // 我叫小方,她叫小明

依然是百分號%開頭,中間多了個2$,1$,即把「小明」這個值放到1$所在的位置,「小方」放在2$所在的位置。

至此,咱們已經瞭解了argument_index$conversion的用處,接下來咱們瞭解flagwidth的用法

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

接下來講下.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_indexflagswidth 的定義同上。

所需的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()的用法,重點在於瞭解format參數表達式的做用,更多的使用方式可參閱JDK文檔。

相關文章
相關標籤/搜索