String.format() 方法用法解说
?
前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到教程。
String chargeFlowUrl = _AGENT_URL+ "?agentAccount=" +_AGENT_ACCOUNT +"&sequence=%s &phone=%s &iceUrl=%s &range=%d &size=%d &_timestamp=%s";String url = String.format(chargeFlowUrl, sequence, phone , noticeUrl , range, size, URLEncoder.encode(timestamp, "utf-8"));在這里%S 像是一個(gè)通配符,把參數(shù)一個(gè)一個(gè)按順序填到對(duì)應(yīng)位置。
JDK1.5開始String類中提供了一個(gè)非常有用的方法String.format(String format, Object ... args)
查看源碼得知其實(shí)是調(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) 這個(gè)方法最重要的的地方就是它的第一個(gè)參數(shù)String format,我們只要掌握了這個(gè)參數(shù)的用法也就掌握了String.format的用法
首先來看一個(gè)列子
String?s2?=?String.format("%1$tY-%1$tm-%1$te",?new?Date());?? System.out.println(s2);??這里會(huì)打印出什么內(nèi)容?
先不急著去運(yùn)行它,相信閱讀到后面不用運(yùn)行,你也會(huì)知道的.
?
查看JDK文檔得知,String.format方法的第一個(gè)參數(shù)是有個(gè)公式可以套的
????%[argument_index$][flags][width][.precision]conversion
這里我們只要牢記這個(gè)公式就可以,下面說下每個(gè)顏色所代表的含義
argument_index: 可選,是一個(gè)十進(jìn)制整數(shù),用于表明參數(shù)在參數(shù)列表中的位置。第一個(gè)參數(shù)由 "1$" 引用,第二個(gè)參數(shù)由 "2$" 引用,依此類推。
flags:?可選,用來控制輸出格式
width:?可選,是一個(gè)正整數(shù),表示輸出的最小長度
precision:可選,用來限定輸出字符數(shù)
conversion:必須,用來表示如何格式化參數(shù)的字符
?
先看一個(gè)簡單的列子:
System.out.println(String.format("我的名字叫%s",?"小明"));?//?打印:我的名字叫小明??這里我們只用了%s這個(gè)簡單的表達(dá)式,對(duì)比上面的公式,我們發(fā)現(xiàn)[argument_index$][flags][width][.precision]這些部分全部都省略掉了
只留下一個(gè)必須的conversion,在這里conversion就是"s",百分號(hào)%是固定不變的
[argument_index$]省略之后它會(huì)自動(dòng)把"小明"這個(gè)值填入到%s中去
我再稍微改下列子:
String.format("我叫%s,她叫%s",?"小明","小方");?//?我叫小明,她叫小方??
這里會(huì)按順序分別把小明,小方填入到對(duì)應(yīng)的%s中. 如果我們要把小方填在前面,小明填在后面,那該怎么做呢,[argument_index$]就派上用場了
依然是百分號(hào)%開頭,中間多了個(gè)2$,1$
conversion可以填s,那還有什么其它字母可以填呢,當(dāng)然有的比如
o:結(jié)果被格式化為八進(jìn)制整數(shù)
x:結(jié)果被格式化為十六進(jìn)制
d:結(jié)果被格式化為十進(jìn)制整數(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是用來控制輸出格式的,比如左對(duì)齊,金額用逗號(hào)隔開等
width:表示最小寬度
先看個(gè)列子:
String.format("%1$,d",?12302562);?//?12,302,562??這里多出一個(gè)逗號(hào)",",它就是flag,用于金額千分位隔開,當(dāng)然寫成"%,d"也是可以的
再一個(gè)列子:
String.format("%1$08d",?123456);//?00123456??這里0就是flag,表示結(jié)果將用零來填充,8就是width,表示最少要8位,d是conversion
至于其它的flag可以查閱JDK文檔
?
接下來說下[.precision]
這個(gè)單詞翻譯下是精度的意思,我們發(fā)現(xiàn)了前面有個(gè)小數(shù)點(diǎn)".",因此不難聯(lián)想到這個(gè)是關(guān)于浮點(diǎn)數(shù)類型的
只有當(dāng)傳入的數(shù)據(jù)是浮點(diǎn)數(shù)時(shí)這個(gè)才有用,整數(shù)或者日期類型的數(shù)據(jù)都不能用
比如我想要四舍五入保留兩位小數(shù),那么我可以這么寫:
String.format("%1$.2f",?12.12555);//?12.13??
這里f表示傳入的數(shù)字是浮點(diǎn)型,如果傳入的是整數(shù),或者把f改成d都會(huì)拋出異常,JDK文檔中有明確說明
對(duì)于浮點(diǎn)轉(zhuǎn)換?'e'、'E'?和?'f',精度是小數(shù)點(diǎn)分隔符后的位數(shù)。如果轉(zhuǎn)換是?'g'?或?'G',那么精度是舍入計(jì)算后所得數(shù)值的所有位數(shù)。如果轉(zhuǎn)換是?'a'?或?'A',則不必指定精度。
對(duì)于字符、整數(shù)和日期/時(shí)間參數(shù)類型轉(zhuǎn)換,以及百分比和行分隔符轉(zhuǎn)換,精度是不適用的;如果提供精度,則會(huì)拋出異常。
到現(xiàn)在為止這套表達(dá)式公式已經(jīng)基本講完了,這套公式是針對(duì)于基本數(shù)據(jù)類型,和字符串的,如果是正對(duì)于時(shí)間類型的數(shù)據(jù)該怎么做呢,比如格式化日期
其實(shí)文檔中已經(jīng)給出說明了:
- 用來表示日期和時(shí)間類型的格式說明符的語法如下: %[argument_index$][flags][width]conversion
可選的?argument_index、flags?和?width?的定義同上。
所需的?conversion?是一個(gè)由兩字符組成的序列。第一個(gè)字符是?'t'?或?'T'。第二個(gè)字符表明所使用的格式。這些字符類似于但不完全等同于那些由 GNU?date?和 POSIX?strftime(3c)?定義的字符。
需要注意的是conversion?是一個(gè)由兩字符組成的序列。第一個(gè)字符是?'t'?或?'T'。
也就是說用conversion的時(shí)候首先必要寫一個(gè)"t",然后在寫其它c(diǎn)onversion
時(shí)間類型有它自己的一套conversion,我們簡單的選擇幾個(gè)來說:
'Y' 年份,被格式化為必要時(shí)帶前導(dǎo)零的四位數(shù)(至少),例如,0092?等于格里高利歷的?92?CE。 'm' 月份,被格式化為必要時(shí)帶前導(dǎo)零的兩位數(shù),即?01 - 13。 'd' 一個(gè)月中的天數(shù),被格式化為必要時(shí)帶前導(dǎo)零兩位數(shù),即?01 - 31 上面三個(gè)分別表示年月日
如果我要顯示年份,我就可以"%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文檔也會(huì)慢慢了解的
需要批量進(jìn)行格式化時(shí),考慮下DateFormat,?MessageFormat,?NumberFormat?把他們封裝成一個(gè)靜態(tài)工具類或許更好
畢竟調(diào)用String.format()方法是會(huì)new一個(gè)Formatter對(duì)象,雖然有GC幫忙,但是平時(shí)編程的時(shí)候還是要考慮這些因素的
盡量少的創(chuàng)建對(duì)象,節(jié)省資源
?
總結(jié)
以上是生活随笔為你收集整理的String.format() 方法用法解说的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OOA:面向对象
- 下一篇: 解决 dubbo问题:Forbid co