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- public
- return new Formatter().format(format, args).toString();
- }
String.format(String format, Object ... args) 這個方法最重要的的地方就是它的第一個引數String format,我們只要掌握了這個引數的用法也就掌握了String.format的用法
首先來看一個列子
[java] view plain copy- 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:必須,用來表示如何格式化引數的字元
先看一個簡單的列子:
[java] view plain copy- System.out.println(String.format("我的名字叫%s", "小明")); // 列印:我的名字叫小明
這裡我們只用了%s這個簡單的表示式,對比上面的公式,我們發現[argument_index$][flags][width][.precision]這些部分全部都省略掉了
只留下一個必須的conversion,在這裡conversion就是"s",百分號%是固定不變的
[argument_index$]省略之後它會自動把"小明"這個值填入到%s中去
我再稍微改下列子:
[java] view plain copy- String.format("我叫%s,她叫%s", "小明","小方"); // 我叫小明,她叫小方
這裡會按順序分別把小明,小方填入到對應的%s中. 如果我們要把小方填在前面,小明填在後面,那該怎麼做呢,[argument_index$]就派上用場了
- String.format("我叫%2$s,她叫%1$s", "小明","小方"); // 我叫小方,她叫小明
依然是百分號%開頭,中間多了個2$,1$
conversion可以填s,那還有什麼其它字母可以填呢,當然有的比如
o:結果被格式化為八進位制整數
x:結果被格式化為十六進位制
d:結果被格式化為十進位制整數
[java] view plain copy- 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:表示最小寬度
先看個列子:
[java] view plain copy- String.format("%1$,d", 12302562); // 12,302,562
這裡多出一個逗號",",它就是flag,用於金額千分位隔開,當然寫成"%,d"也是可以的
再一個列子:
[java] view plain copy- String.format("%1$08d", 123456);// 00123456
這裡0就是flag,表示結果將用零來填充,8就是width,表示最少要8位,d是conversion
至於其它的flag可以查閱JDK文件
接下來說下[.precision]
這個單詞翻譯下是精度的意思,我們發現了前面有個小數點".",因此不難聯想到這個是關於浮點數型別的
只有當傳入的資料是浮點數時這個才有用,整數或者日期型別的資料都不能用
比如我想要四捨五入保留兩位小數,那麼我可以這麼寫:
[java] view plain copy- 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"
那麼本篇一開始提到的那串複雜的表示式現在看來是不是很簡單呢:
[java] view plain copy- 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幫忙,但是平時程式設計的時候還是要考慮這些因素的
儘量少的建立物件,節省資源
轉 換 符 |
說 明 |
示 例 |
%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代表不同的日期與時間轉換符 |