String.format()方法使用说明
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
JDK1.5開始String類中提供了一個非常有用的方法String.format(String format, Object ... args)
查看源碼得知其實是調(diào)用了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) 這個方法最重要的的地方就是它的第一個參數(shù)String format,我們只要掌握了這個參數(shù)的用法也就掌握了String.format的用法
?
首先來看一個列子
String?s2?=?String.format("%1$tY-%1$tm-%1$te",?new?Date());?? System.out.println(s2);??這里會打印出什么內(nèi)容?
先不急著去運行它,相信閱讀到后面不用運行,你也會知道的.
查看JDK文檔得知,String.format方法的第一個參數(shù)是有個公式可以套的
這里我們只要牢記這個公式就可以,下面說下每個顏色所代表的含義
argument_index: 可選,是一個十進制整數(shù),用于表明參數(shù)在參數(shù)列表中的位置。第一個參數(shù)由 "1$" 引用,第二個參數(shù)由 "2$" 引用,依此類推。
flags:?可選,用來控制輸出格式
width:?可選,是一個正整數(shù),表示輸出的最小長度
precision:可選,用來限定輸出字符數(shù)
conversion:必須,用來表示如何格式化參數(shù)的字符
?
先看一個簡單的列子:
System.out.println(String.format("我的名字叫%s",?"小明"));?//?打印:我的名字叫小明??這里我們只用了%s這個簡單的表達(dá)式,對比上面的公式,我們發(fā)現(xiàn)[argument_index$][flags][width][.precision]這些部分全部都省略掉了
只留下一個必須的conversion,在這里conversion就是"s",百分號%是固定不變的
[argument_index$]省略之后它會自動把"小明"這個值填入到%s中去
我再稍微改下列子:
String.format("我叫%s,她叫%s",?"小明","小方");?//?我叫小明,她叫小方??
這里會按順序分別把小明,小方填入到對應(yīng)的%s中. 如果我們要把小方填在前面,小明填在后面,那該怎么做呢,[argument_index$]就派上用場了
依然是百分號%開頭,中間多了個2$,1$
?
conversion可以填s,那還有什么其它字母可以填呢,當(dāng)然有的比如
o:結(jié)果被格式化為八進制整數(shù)
x:結(jié)果被格式化為十六進制
d:結(jié)果被格式化為十進制整數(shù)
System.out.println(String.format("%o",?8));?//?10?? System.out.println(String.format("%x",?16));?//?10??
更多的conversion類別可以參考JDK文檔java.util.Formatter類
至此,我們已經(jīng)了解了argument_index$和conversion的用處,接下來我們了解flag和width的用法
flag是用來控制輸出格式的,比如左對齊,金額用逗號隔開等
width:表示最小寬度
先看個列子:
String.format("%1$,d",?12302562);?//?12,302,562??這里多出一個逗號",",它就是flag,用于金額千分位隔開,當(dāng)然寫成"%,d"也是可以的
再一個列子:
String.format("%1$08d",?123456);//?00123456??這里0就是flag,表示結(jié)果將用零來填充,8就是width,表示最少要8位,d是conversion
至于其它的flag可以查閱JDK文檔
?
接下來說下[.precision]
這個單詞翻譯下是精度的意思,我們發(fā)現(xiàn)了前面有個小數(shù)點".",因此不難聯(lián)想到這個是關(guān)于浮點數(shù)類型的
只有當(dāng)傳入的數(shù)據(jù)是浮點數(shù)時這個才有用,整數(shù)或者日期類型的數(shù)據(jù)都不能用
比如我想要四舍五入保留兩位小數(shù),那么我可以這么寫:
String.format("%1$.2f",?12.12555);//?12.13??這里f表示傳入的數(shù)字是浮點型,如果傳入的是整數(shù),或者把f改成d都會拋出異常,JDK文檔中有明確說明
對于浮點轉(zhuǎn)換?'e'、'E'?和?'f',精度是小數(shù)點分隔符后的位數(shù)。如果轉(zhuǎn)換是?'g'?或?'G',那么精度是舍入計算后所得數(shù)值的所有位數(shù)。如果轉(zhuǎn)換是?'a'?或?'A',則不必指定精度。
對于字符、整數(shù)和日期/時間參數(shù)類型轉(zhuǎn)換,以及百分比和行分隔符轉(zhuǎn)換,精度是不適用的;如果提供精度,則會拋出異常。
到現(xiàn)在為止這套表達(dá)式公式已經(jīng)基本講完了,這套公式是針對于基本數(shù)據(jù)類型,和字符串的,如果是正對于時間類型的數(shù)據(jù)該怎么做呢,比如格式化日期
其實文檔中已經(jīng)給出說明了:
- 用來表示日期和時間類型的格式說明符的語法如下 %[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' 年份,被格式化為必要時帶前導(dǎo)零的四位數(shù)(至少),例如,0092?等于格里高利歷的?92?CE。 ?
'm' 月份,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即?01 - 13。 ?
'd' 一個月中的天數(shù),被格式化為必要時帶前導(dǎo)零兩位數(shù),即?01 - 31 ?
上面三個分別表示年月日
如果我要顯示年份,我就可以"%tY",顯示月份我就可以寫"%tm",記得一定要帶上"t"
那么本篇一開始提到的那串復(fù)雜的表達(dá)式現(xiàn)在看來是不是很簡單呢:
String?s2?=?String.format("%1$tY-%1$tm-%1$te",?new?Date());?? System.out.println(s2);????String.format()方法差不多講完了,仔細(xì)看JDK文檔也會慢慢了解的
需要批量進行格式化時,考慮下DateFormat,?MessageFormat,?NumberFormat?把他們封裝成一個靜態(tài)工具類或許更好
畢竟調(diào)用String.format()方法是會new一個Formatter對象,雖然有GC幫忙,但是平時編程的時候還是要考慮這些因素的
盡量少的創(chuàng)建對象,節(jié)省資源
轉(zhuǎn)載于:https://my.oschina.net/u/2331760/blog/880628
總結(jié)
以上是生活随笔為你收集整理的String.format()方法使用说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 文件上传下载管理器(控制台)
- 下一篇: 第五届上交会欲打通技术贸易“最后一公里”