1. 程式人生 > >Strig.format(String format, Object... args)常用格式說明符

Strig.format(String format, Object... args)常用格式說明符

轉載:https://blog.csdn.net/thc1987/article/details/17528093

比原文要多點自己的修改,原文地址在上邊,作者寫的很清楚很好,分享給大家

JDK1.5開始String類中提供了一個非常有用的方法String.format(String format, Object ... args)

檢視原始碼得知其實是呼叫了java.util.Formatter.format(String, Object...)方法

[java]  view plain  copy
  1. public
     static String format(String format, Object ... args) {  
  2.     return new Formatter().format(format, args).toString();  
  3. }  

String.format(String format, Object ... args) 這個方法最重要的的地方就是它的第一個引數String format,我們只要掌握了這個引數的用法也就掌握了String.format的用法

 

首先來看一個列子

[java]  view plain  copy
  1. String s2 = String.format("%1$tY-%1$tm-%1$te"new Date());  
  2. System.out.println(s2);  


這裡會打印出什麼內容?

先不急著去執行它,相信閱讀到後面不用執行,你也會知道的.

 

檢視JDK文件得知,String.format方法的第一個引數是有個公式可以套的

    %[argument_index$][flags][width][.precision]conversion

這裡我們只要牢記這個公式就可以,下面說下每個顏色所代表的含義

argument_index: 可選,是一個十進位制整數,用於表明引數在引數列表中的位置。第一個引數由 "1$" 引用,第二個引數由 "2$" 引用,依此類推。

flags: 可選,用來控制輸出格式

width可選,是一個正整數,表示輸出的最小長度

precision:可選,用來限定輸出字元數

conversion:必須,用來表示如何格式化引數的字元

 

先看一個簡單的列子:

[java]  view plain  copy
  1. System.out.println(String.format("我的名字叫%s""小明")); // 列印:我的名字叫小明  

這裡我們只用了%s這個簡單的表示式,對比上面的公式,我們發現[argument_index$][flags][width][.precision]這些部分全部都省略掉了

只留下一個必須的conversion,在這裡conversion就是"s",百分號%是固定不變的

[argument_index$]省略之後它會自動把"小明"這個值填入到%s中去

我再稍微改下列子:

[java]  view plain  copy
  1. String.format("我叫%s,她叫%s""小明","小方"); // 我叫小明,她叫小方  


這裡會按順序分別把小明,小方填入到對應的%s中. 如果我們要把小方填在前面,小明填在後面,那該怎麼做呢,[argument_index$]就派上用場了

[java]  view plain  copy
  1. String.format("我叫%2$s,她叫%1$s""小明","小方"); // 我叫小方,她叫小明  

依然是百分號%開頭,中間多了個2$,1$

 

conversion可以填s,那還有什麼其它字母可以填呢,當然有的比如

o:結果被格式化為八進位制整數

x:結果被格式化為十六進位制

d:結果被格式化為十進位制整數

[java]  view plain  copy
  1. System.out.println(String.format("%o"8)); // 10  
  2. System.out.println(String.format("%x"16)); // 10  


更多的conversion類別可以參考JDK文件java.util.Formatter類


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

flag是用來控制輸出格式的,比如左對齊,金額用逗號隔開等

width:表示最小寬度

先看個列子:

[java]  view plain  copy
  1. String.format("%1$,d"12302562); // 12,302,562  


這裡多出一個逗號",",它就是flag,用於金額千分位隔開,當然寫成"%,d"也是可以的

再一個列子:

[java]  view plain  copy
  1. String.format("%1$08d"123456);// 00123456  


這裡0就是flag,表示結果將用零來填充,8就是width,表示最少要8位,d是conversion

至於其它的flag可以查閱JDK文件

 

接下來說下[.precision]

這個單詞翻譯下是精度的意思,我們發現了前面有個小數點".",因此不難聯想到這個是關於浮點數型別的

只有當傳入的資料是浮點數時這個才有用,整數或者日期型別的資料都不能用

比如我想要四捨五入保留兩位小數,那麼我可以這麼寫:

[java]  view plain  copy
  1. 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_indexflags 和 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"

那麼本篇一開始提到的那串複雜的表示式現在看來是不是很簡單呢:

[java]  view plain  copy
  1. String s2 = String.format("%1$tY-%1$tm-%1$te"new Date());  
  2. System.out.println(s2);    

String.format()方法差不多講完了,仔細看JDK文件也會慢慢了解的

需要批量進行格式化時,考慮下DateFormatMessageFormatNumberFormat 把他們封裝成一個靜態工具類或許更好

畢竟呼叫String.format()方法是會new一個Formatter物件,雖然有GC幫忙,但是平時程式設計的時候還是要考慮這些因素的

儘量少的建立物件,節省資源




轉  換  符

說    明 

示    例

%s

字串型別

"memeda"

%c

字元型別

'm'

%b

布林型別

true

%d

整數型別(十進位制)

99

%x

整數型別(十六進位制)

FF

%o

整數型別(八進位制)

77

%f

浮點型別

99.99

%a

十六進位制浮點型別

FF.35AE

%e

指數型別

9.38e+5

%g

通用浮點型別(f和e型別中較短的)

 

%h

雜湊碼

 

%%

百分比型別

%n

換行符

 

%tx

日期與時間型別(x代表不同的日期與時間轉換符