JDK1.5中,String類新增了一個很有用的靜態(tài)方法String.format():
format(Locale l, String format, Object... args) 使用指定的語言環(huán)境、格式字符串和參數(shù)返回一個格式化字符串。
format(String format, Object... args) 使用指定的格式字符串和參數(shù)返回一個格式化字符串。
舉幾個這個方法實用的例子(注釋是輸出結(jié)果):
CODE:
long now = System.currentTimeMillis();
String s = String.format("%tR", now); // "15:12"
CODE:
// Current month/day/year
Date d = new Date(now);
s = String.format("%tD", d); // "07/13/04"
CODE:
s = String.format("%,d", Integer.MAX_VALUE); // "2,147,483,647"
CODE:
s = String.format("%05d", 123); // "00123"
是不是很方便,讓人動心啊?哈哈,還有更多的效果!
其實format函數(shù)有些類似c語言中printf函數(shù),一些格式字符串與 C 類似,但已進行了某些定制,以適應(yīng) Java 語言,并且利用了其中一些特性。此方法提供了對布局對齊和排列的支持,以及對數(shù)值、字符串和日期/時間數(shù)據(jù)的常規(guī)格式和特定于語言環(huán)境的輸出的支持。支持諸如 byte、BigDecimal 和 Calendar 等常見 Java 類型。
產(chǎn)生格式化輸出的每個方法都需要格式字符串 和參數(shù)列表。格式字符串是一個 String,它可以包含固定文本以及一個或多個嵌入的格式說明符。請考慮以下示例:
Calendar c = ...;
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);
格式字符串是 format 方法的第一個參數(shù)。它包含三個格式說明符 "%1$tm"、"%1$te" 和 "%1$tY",它們指出應(yīng)該如何處理參數(shù)以及在文本的什么地方插入它們。格式字符串的其余部分是包括 "Dukes Birthday: " 和其他任何空格或標(biāo)點符號的固定文本。 參數(shù)列表由傳遞給位于格式字符串之后的方法的所有參數(shù)組成。在上述示例中,參數(shù)列表的大小為 1,由新對象 Calendar 組成。
1.常規(guī)類型、字符類型和數(shù)值類型的格式說明符的語法如下:%[argument_index$][flags][width][.precision]conversion
可選的 argument_index 是一個十進制整數(shù),用于表明參數(shù)在參數(shù)列表中的位置。第一個參數(shù)由 "1$" 引用,第二個參數(shù)由 "2$" 引用,依此類推。
可選的 flags 是修改輸出格式的字符集。有效標(biāo)志的集合取決于轉(zhuǎn)換類型。
可選 width 是一個非負十進制整數(shù),表明要向輸出中寫入的最少字符數(shù)。
可選 precision 是一個非負十進制整數(shù),通常用來限制字符數(shù)。特定行為取決于轉(zhuǎn)換類型。
所需的 conversion 是一個表明應(yīng)該如何格式化參數(shù)的字符。給定參數(shù)的有效轉(zhuǎn)換集合取決于參數(shù)的數(shù)據(jù)類型。
2.用來表示日期和時間類型的格式說明符的語法如下:
%[argument_index$][flags][width]conversion
可選的 argument_index、flags 和 width 的定義同上。
所需的 conversion 是一個由兩字符組成的序列。第一個字符是 't' 或 'T'。第二個字符表明所使用的格式。這些字符類似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定義的字符。
3.與參數(shù)不對應(yīng)的格式說明符的語法如下:
%[flags][width]conversion
可選 flags 和 width 的定義同上。
所需的 conversion 是一個表明要在輸出中所插內(nèi)容的字符。
轉(zhuǎn)換
轉(zhuǎn)換可分為以下幾類:
1. 常規(guī) - 可應(yīng)用于任何參數(shù)類型
2. 字符 - 可應(yīng)用于表示 Unicode 字符的基本類型:char、Character、byte、Byte、short 和 Short。當(dāng) Character.isValidCodePoint(int) 返回 true 時,可將此轉(zhuǎn)換應(yīng)用于 int 和 Integer 類型
3. 數(shù)值
1. 整數(shù) - 可應(yīng)用于 Java 的整數(shù)類型:byte、Byte、short、Short、int、Integer、long、Long 和 BigInteger
2. 浮點 - 可用于 Java 的浮點類型:float、Float、double、Double 和 BigDecimal
4. 日期/時間 - 可應(yīng)用于 Java 的、能夠?qū)θ掌诨驎r間進行編碼的類型:long、Long、Calendar 和 Date。
5. 百分比 - 產(chǎn)生字面值 '%' ('\u0025')
6. 行分隔符 - 產(chǎn)生特定于平臺的行分隔符
下表總結(jié)了受支持的轉(zhuǎn)換。由大寫字符(如 'B'、'H'、'S'、'C'、'X'、'E'、'G'、'A' 和 'T')表示的轉(zhuǎn)換與由相應(yīng)的小寫字符的轉(zhuǎn)換等同,根據(jù)流行的 Locale 規(guī)則將結(jié)果轉(zhuǎn)換為大寫形式除外。后者等同于 String.toUpperCase() 的以下調(diào)用.
轉(zhuǎn)換 參數(shù)類別 說明
'b', 'B' 常規(guī) 如果參數(shù) arg 為 null,則結(jié)果為 "false"。如果 arg 是一個 boolean 值或 Boolean,則結(jié)果為 String.valueOf() 返回的字符串。否則結(jié)果為 "true"。
'h', 'H' 常規(guī) 如果參數(shù) arg 為 null,則結(jié)果為 "null"。否則,結(jié)果為調(diào)用 Integer.toHexString(arg.hashCode()) 得到的結(jié)果。
's', 'S' 常規(guī) 如果參數(shù) arg 為 null,則結(jié)果為 "null"。如果 arg 實現(xiàn) Formattable,則調(diào)用 arg.formatTo。否則,結(jié)果為調(diào)用 arg.toString() 得到的結(jié)果。
'c', 'C' 字符 結(jié)果是一個 Unicode 字符
'd' 整數(shù) 結(jié)果被格式化為十進制整數(shù)
'o' 整數(shù) 結(jié)果被格式化為八進制整數(shù)
'x', 'X' 整數(shù) 結(jié)果被格式化為十六進制整數(shù)
'e', 'E' 浮點 結(jié)果被格式化為用計算機科學(xué)記數(shù)法表示的十進制數(shù)
'f' 浮點 結(jié)果被格式化為十進制數(shù)
'g', 'G' 浮點 根據(jù)精度和舍入運算后的值,使用計算機科學(xué)記數(shù)形式或十進制格式對結(jié)果進行格式化。
'a', 'A' 浮點 結(jié)果被格式化為帶有效位數(shù)和指數(shù)的十六進制浮點數(shù)
't', 'T' 日期/時間 日期和時間轉(zhuǎn)換字符的前綴。請參閱日期/時間轉(zhuǎn)換。
'%' 百分比 結(jié)果為字面值 '%' ('\u0025')
'n' 行分隔符 結(jié)果為特定于平臺的行分隔符
任何未明確定義為轉(zhuǎn)換的字符都是非法字符,并且都被保留,以供將來擴展使用。
日期/時間轉(zhuǎn)換
以下日期和時間轉(zhuǎn)換的后綴字符是為 't' 和 'T' 轉(zhuǎn)換定義的。這些類型相似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定義的類型。提供其他轉(zhuǎn)換類型是為了訪問特定于 Java 的功能(如將 'L' 用作秒中的毫秒)。
以下轉(zhuǎn)換字符用來格式化時間:
'H' 24 小時制的小時,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 23。
'I' 12 小時制的小時,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 01 - 12。
'k' 24 小時制的小時,即 0 - 23。
'l' 12 小時制的小時,即 1 - 12。
'M' 小時中的分鐘,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 59。
'S' 分鐘中的秒,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 60 ("60" 是支持閏秒所需的一個特殊值)。
'L' 秒中的毫秒,被格式化為必要時帶前導(dǎo)零的三位數(shù),即 000 - 999。
'N' 秒中的毫微秒,被格式化為必要時帶前導(dǎo)零的九位數(shù),即 000000000 - 999999999。
'p' 特定于語言環(huán)境的 上午或下午 標(biāo)記以小寫形式表示,例如 "am" 或 "pm"。使用轉(zhuǎn)換前綴 'T' 可以強行將此輸出轉(zhuǎn)換為大寫形式。
'z' 相對于 GMT 的 RFC 822 格式的數(shù)字時區(qū)偏移量,例如 -0800。
'Z' 表示時區(qū)縮寫形式的字符串。Formatter 的語言環(huán)境將取代參數(shù)的語言環(huán)境(如果有)。
's' 自協(xié)調(diào)世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現(xiàn)在所經(jīng)過的秒數(shù),即 Long.MIN_VALUE/1000 與 Long.MAX_VALUE/1000 之間的差值。
'Q' 自協(xié)調(diào)世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現(xiàn)在所經(jīng)過的毫秒數(shù),即 Long.MIN_VALUE 與 Long.MAX_VALUE 之間的差值。
以下轉(zhuǎn)換字符用來格式化日期:
'B' 特定于語言環(huán)境的月份全稱,例如 "January" 和 "February"。
'b' 特定于語言環(huán)境的月份簡稱,例如 "Jan" 和 "Feb"。
'h' 與 'b' 相同。
'A' 特定于語言環(huán)境的星期幾全稱,例如 "Sunday" 和 "Monday"
'a' 特定于語言環(huán)境的星期幾簡稱,例如 "Sun" 和 "Mon"
'C' 除以 100 的四位數(shù)表示的年份,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 99
'Y' 年份,被格式化為必要時帶前導(dǎo)零的四位數(shù)(至少),例如,0092 等于格里高利歷的 92 CE。
'y' 年份的最后兩位數(shù),被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 99。
'j' 一年中的天數(shù),被格式化為必要時帶前導(dǎo)零的三位數(shù),例如,對于格里高利歷是 001 - 366。
'm' 月份,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 01 - 13。
'd' 一個月中的天數(shù),被格式化為必要時帶前導(dǎo)零兩位數(shù),即 01 - 31
'e' 一個月中的天數(shù),被格式化為兩位數(shù),即 1 - 31。
以下轉(zhuǎn)換字符用于格式化常見的日期/時間組合。
'R' 24 小時制的時間,被格式化為 "%tH:%tM"
'T' 24 小時制的時間,被格式化為 "%tH:%tM:%tS"。
'r' 12 小時制的時間,被格式化為 "%tI:%tM:%tS %Tp"。上午或下午標(biāo)記 ('%Tp') 的位置可能與語言環(huán)境有關(guān)。
'D' 日期,被格式化為 "%tm/%td/%ty"。
'F' ISO 8601 格式的完整日期,被格式化為 "%tY-%tm-%td"。
'c' 日期和時間,被格式化為 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969"。
任何未明確定義為轉(zhuǎn)換的字符都是非法字符,并且都被保留,以供將來擴展使用。
標(biāo)志
下表總結(jié)了受支持的標(biāo)志。y 表示該標(biāo)志受指示參數(shù)類型支持。
標(biāo)志 常規(guī) 字符 整數(shù) 浮點 日期/時間 說明
'-' y y y y y 結(jié)果將是左對齊的。
'#' y1 - y3 y - 結(jié)果應(yīng)該使用依賴于轉(zhuǎn)換類型的替換形式
'+' - - y4 y - 結(jié)果總是包括一個符號
' ' - - y4 y - 對于正值,結(jié)果中將包括一個前導(dǎo)空格
'0' - - y y - 結(jié)果將用零來填充
',' - - y2 y5 - 結(jié)果將包括特定于語言環(huán)境的組分隔符
'(' - - y4 y5 - 結(jié)果將是用圓括號括起來的負數(shù)
1 取決于 Formattable 的定義。
2 只適用于 'd' 轉(zhuǎn)換。
3 只適用于 'o'、'x' 和 'X' 轉(zhuǎn)換。
4 對 BigInteger 應(yīng)用 'd'、'o'、'x' 和 'X' 轉(zhuǎn)換時,或者對 byte 及 Byte、short 及 Short、int 及 Integer、long 及 Long 分別應(yīng)用 'd' 轉(zhuǎn)換時適用。
5 只適用于 'e'、'E'、'f'、'g' 和 'G' 轉(zhuǎn)換。
任何未顯式定義為標(biāo)志的字符都是非法字符,并且都被保留,以供擴展使用。
寬度 寬度是將向輸出中寫入的最少字符數(shù)。對于行分隔符轉(zhuǎn)換,不適用寬度,如果提供寬度,則會拋出異常。
精度 對于常規(guī)參數(shù)類型,精度是將向輸出中寫入的最多字符數(shù)。
對于浮點轉(zhuǎn)換 'e'、'E' 和 'f',精度是小數(shù)點分隔符后的位數(shù)。如果轉(zhuǎn)換是 'g' 或 'G',那么精度是舍入計算后所得數(shù)值的所有位數(shù)。如果轉(zhuǎn)換是 'a' 或 'A',則不必指定精度。
對于字符、整數(shù)和日期/時間參數(shù)類型轉(zhuǎn)換,以及百分比和行分隔符轉(zhuǎn)換,精度是不適用的;如果提供精度,則會拋出異常。
參數(shù)索引 參數(shù)索引是一個十進制整數(shù),用于表明參數(shù)在參數(shù)列表中的位置。第一個參數(shù)由 "1$" 引用,第二個參數(shù)由 "2$" 引用,依此類推。
根據(jù)位置引用參數(shù)的另一種方法是使用 '<' ('\u003c') 標(biāo)志,這將會重用以前格式說明符的參數(shù)。例如,以下兩條語句產(chǎn)生的字符相同:
Calendar c = ...;
String s1 = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);
String s2 = String.format("Duke's Birthday: %1$tm %<$te,%<$tY", c);
在JDK1.5中,String類增加了一個非常有用的靜態(tài)函數(shù)format(String format, Objece... argues),可以將各類數(shù)據(jù)格式化為字符串并輸出。其中format參數(shù)指定了輸出的格式,是最復(fù)雜也是最難掌握的一點,而argues則是一系列等待被格式化的對象。該函數(shù)對c語言中printf函數(shù)的用法進行了一定的模仿,因此有c語言基礎(chǔ)的人學(xué)起來會輕松許多。下面我們著重討論一下format 參數(shù)的格式及含義。
format參數(shù)中可以包含不需要轉(zhuǎn)化的字符串,這些字符串是你寫什么,最終就輸出什么。同時還包含一些特殊格式的內(nèi)容,來指定將哪個對象來轉(zhuǎn)換,以及轉(zhuǎn)換成什么形式。這種特殊的格式通通以%index$開頭,index從1開始取值,表示將第index個參數(shù)拿進來進行格式化。這一點比c語言要強一點, c語言只能按照參數(shù)的順序依次格式化,而java可以選擇第n個參數(shù)來格式化。由于該函數(shù)可以對任意一個對象進行格式化,不同的對象適用的參數(shù)也不同,因此我們下面分類來討論。
1.對整數(shù)進行格式化:%[index$][標(biāo)識][最小寬度]轉(zhuǎn)換方式
我們可以看到,格式化字符串由4部分組成,其中%[index$]的含義我們上面已經(jīng)講過,[最小寬度]的含義也很好理解,就是最終該整數(shù)轉(zhuǎn)化的字符串最少包含多少位數(shù)字。我們來看看剩下2個部分的含義吧:
標(biāo)識:
'-' 在最小寬度內(nèi)左對齊,不可以與“用0填充”同時使用
'#' 只適用于8進制和16進制,8進制時在結(jié)果前面增加一個0,16進制時在結(jié)果前面增加0x
'+' 結(jié)果總是包括一個符號(一般情況下只適用于10進制,若對象為BigInteger才可以用于8進制和16進制)
' ' 正值前加空格,負值前加負號(一般情況下只適用于10進制,若對象為BigInteger才可以用于8進制和16進制)
'0' 結(jié)果將用零來填充
',' 只適用于10進制,每3位數(shù)字之間用“,”分隔
'(' 若參數(shù)是負數(shù),則結(jié)果中不添加負號而是用圓括號把數(shù)字括起來(同‘+’具有同樣的限制)
轉(zhuǎn)換方式:
d-十進制 o-八進制 x或X-十六進制 上面的說明過于枯燥,我們來看幾個具體的例子。需要特別注意的一點是:大部分標(biāo)識字符可以同時使用。
System.out.println(String.format("%1$,09d", -3123));
System.out.println(String.format("%1$9d", -31));
System.out.println(String.format("%1$-9d", -31));
System.out.println(String.format("%1$(9d", -31));
System.out.println(String.format("%1$#9x", 5689));
//結(jié)果為:
//-0003,123
// -31
//-31
// (31)
// 0x1639
2.對浮點數(shù)進行格式化:%[index$][標(biāo)識][最少寬度][.精度]轉(zhuǎn)換方式
我們可以看到,浮點數(shù)的轉(zhuǎn)換多了一個“精度”選項,可以控制小數(shù)點后面的位數(shù)。
標(biāo)識:
'-' 在最小寬度內(nèi)左對齊,不可以與“用0填充”同時使用
'+' 結(jié)果總是包括一個符號
' ' 正值前加空格,負值前加負號
'0' 結(jié)果將用零來填充
',' 每3位數(shù)字之間用“,”分隔(只適用于fgG的轉(zhuǎn)換)
'(' 若參數(shù)是負數(shù),則結(jié)果中不添加負號而是用圓括號把數(shù)字括起來(只適用于eEfgG的轉(zhuǎn)換)
轉(zhuǎn)換方式:
'e', 'E' -- 結(jié)果被格式化為用計算機科學(xué)記數(shù)法表示的十進制數(shù)
'f' -- 結(jié)果被格式化為十進制普通表示方式
'g', 'G' -- 根據(jù)具體情況,自動選擇用普通表示方式還是科學(xué)計數(shù)法方式
'a', 'A' -- 結(jié)果被格式化為帶有效位數(shù)和指數(shù)的十六進制浮點數(shù)
3.對字符進行格式化:
對字符進行格式化是非常簡單的,c表示字符,標(biāo)識中'-'表示左對齊,其他就沒什么了。
4.對百分比符號進行格式化:
看了上面的說明,大家會發(fā)現(xiàn)百分比符號“%”是特殊格式的一個前綴。那么我們要輸入一個百分比符號該怎么辦呢?肯定是需要轉(zhuǎn)義字符的,但是要注意的是,在這里轉(zhuǎn)義字符不是“\”,而是“%”。換句話說,下面這條語句可以輸出一個“12%”:
System.out.println(String.format("%1$d%%", 12));
5.取得平臺獨立的行分隔符:
System.getProperty("line.separator")可以取得平臺獨立的行分隔符,但是用在format中間未免顯得過于煩瑣了。于是format函數(shù)自帶了一個平臺獨立的行分隔符那就是String.format("%n")。
6.對日期類型進行格式化:
以下日期和時間轉(zhuǎn)換的后綴字符是為 't' 和 'T' 轉(zhuǎn)換定義的。這些類型相似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定義的類型。提供其他轉(zhuǎn)換類型是為了訪問特定于 Java 的功能(如將 'L' 用作秒中的毫秒)。
以下轉(zhuǎn)換字符用來格式化時間:
'H' 24 小時制的小時,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 23。
'I' 12 小時制的小時,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 01 - 12。
'k' 24 小時制的小時,即 0 - 23。
'l' 12 小時制的小時,即 1 - 12。
'M' 小時中的分鐘,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 59。
'S' 分鐘中的秒,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 60 ("60" 是支持閏秒所需的一個特殊值)。
'L' 秒中的毫秒,被格式化為必要時帶前導(dǎo)零的三位數(shù),即 000 - 999。
'N' 秒中的毫微秒,被格式化為必要時帶前導(dǎo)零的九位數(shù),即 000000000 - 999999999。
'p' 特定于語言環(huán)境的上午或下午 標(biāo)記以小寫形式表示,例如 "am" 或 "pm"。使用轉(zhuǎn)換前綴 'T' 可以強行將此輸出轉(zhuǎn)換為大寫形式。
'z' 相對于 GMT 的 RFC 822 格式的數(shù)字時區(qū)偏移量,例如 -0800。
'Z' 表示時區(qū)縮寫形式的字符串。Formatter 的語言環(huán)境將取代參數(shù)的語言環(huán)境(如果有)。
's' 自協(xié)調(diào)世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現(xiàn)在所經(jīng)過的秒數(shù),即 Long.MIN_VALUE/1000 與 Long.MAX_VALUE/1000 之間的差值。
'Q' 自協(xié)調(diào)世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現(xiàn)在所經(jīng)過的毫秒數(shù),即 Long.MIN_VALUE 與 Long.MAX_VALUE 之間的差值。
以下轉(zhuǎn)換字符用來格式化日期:
'B' 特定于語言環(huán)境的月份全稱,例如 "January" 和 "February"。
'b' 特定于語言環(huán)境的月份簡稱,例如 "Jan" 和 "Feb"。
'h' 與 'b' 相同。
'A' 特定于語言環(huán)境的星期幾全稱,例如 "Sunday" 和 "Monday"
'a' 特定于語言環(huán)境的星期幾簡稱,例如 "Sun" 和 "Mon"
'C' 除以 100 的四位數(shù)表示的年份,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 99
'Y' 年份,被格式化為必要時帶前導(dǎo)零的四位數(shù)(至少),例如,0092 等于格里高利歷的 92 CE。
'y' 年份的最后兩位數(shù),被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 99。
'j' 一年中的天數(shù),被格式化為必要時帶前導(dǎo)零的三位數(shù),例如,對于格里高利歷是 001 - 366。
'm' 月份,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 01 - 13。
'd' 一個月中的天數(shù),被格式化為必要時帶前導(dǎo)零兩位數(shù),即 01 - 31
'e' 一個月中的天數(shù),被格式化為兩位數(shù),即 1 - 31。
以下轉(zhuǎn)換字符用于格式化常見的日期/時間組合。
'R' 24 小時制的時間,被格式化為 "%tH:%tM"
'T' 24 小時制的時間,被格式化為 "%tH:%tM:%tS"。
'r' 12 小時制的時間,被格式化為 "%tI:%tM:%tS %Tp"。上午或下午標(biāo)記 ('%Tp') 的位置可能與語言環(huán)境有關(guān)。
'D' 日期,被格式化為 "%tm/%td/%ty"。
'F' ISO 8601 格式的完整日期,被格式化為 "%tY-%tm-%td"。
'c' 日期和時間,被格式化為 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969"。
文章出處:飛諾網(wǎng)(www.firnow.com):http://dev.firnow.com/course/3_program/java/javashl/2008107/148918.html