歡迎您光臨本站 註冊首頁

Java中String.format的用法

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

JDK1.5中,String類新增了一個很有用的靜態方法String.format():

format(Locale l, String format, Object… args) 使用指定的語言環境、格式字元串和參數返回一個格式化字元串.

format(String format, Object… args) 使用指定的格式字元串和參數返回一個格式化字元串.

1.對整數進行格式化:%[index$][標識][最小寬度]轉換方式.

我們可以看到,格式化字元串由4部分組成,其中%[index$]的含義我們上面已經講過,[最小寬度]的含義也很好理解,就是最終該整數轉化的字元串最少包含多少位數字.我們來看看剩下2個部分的含義吧:

標 識:

'-' 在最小寬度內左對齊,不可以與「用0填充」同時使用

'#' 只適用於8進位和16進位,8進位時在結果前面增加一個0,16進位時在結果前面增加0x

' ' 結果總是包括一個符號(一般情況下只適用於10進位,若對象為BigInteger才可以用於8進位和16進位)

' ' 正值前加空格,負值前加負號(一般情況下只適用於10進位,若對象為BigInteger才可以用於8進位和16進位)

'0' 結果將用零來填充

',' 只適用於10進位,每3位數字之間用「,」分隔

'(' 若參數是負數,則結果中不添加負號而是用圓括弧把數字括起來(同『 』具有同樣的限制)

轉換方式:

d-十進位 o-八進位 x或X-十六進位

上面的說明過於枯燥,我們來看幾個具體的例子.需要特別注意的一點是:大部分標識字元可以同時使用.

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)); //結果為: //-0003,123 // -31 //-31 // (31) // 0x1639

2.對浮點數進行格式化:%[index$][標識][最少寬度][.精度]轉換方式

我們可以看到,浮點數的轉換多了一個「精度」選項,可以控制小數點後面的位數.

標識:

'-' 在最小寬度內左對齊,不可以與「用0填充」同時使用

' ' 結果總是包括一個符號

' ' 正值前加空格,負值前加負號

'0' 結果將用零來填充

',' 每3位數字之間用「,」分隔(只適用於fgG的轉換)

'(' 若參數是負數,則結果中不添加負號而是用圓括弧把數字括起來(只適用於eEfgG的轉換)

轉換方式:

'e', 'E' -- 結果被格式化為用計算機科學記數法表示的十進位數

'f' -- 結果被格式化為十進位普通表示方式

'g', 'G' -- 根據具體情況,自動選擇用普通表示方式還是科學計數法方式

'a', 'A' -- 結果被格式化為帶有效位數和指數的十六進位浮點數

3.對字元進行格式化:

對字元進行格式化是非常簡單的,c表示字元,標識中'-'表示左對齊,其他就沒什麼了.

4.對百分比符號進行格式化:

看了上面的說明,大家會發現百分比符號「%」是特殊格式的一個前綴.那麼我們要輸入一個百分比符號該怎麼辦呢?肯定是需要轉義字元的,但是要注意的是,在這裡轉義字元不是「\」,而是「%」.換句話說,下面這條語句可以輸出一個「12%」:

System.out.println(String.format("%1$d%%", 12));

5.取得平台獨立的行分隔符:

System.getProperty("line.separator")可以取得平台獨立的行分隔符,但是用在format中間未免顯得過於煩瑣了.於是format函數自帶了一個平台獨立的行分隔符那就是String.format("%n").

6.對日期類型進行格式化:

以下日期和時間轉換的後綴字元是為 't' 和 'T' 轉換定義的.這些類型相似於但不完全等同於那些由 GNU date 和 POSIX strftime(3c) 定義的類型.提供其他轉換類型是為了訪問特定於 Java 的功能(如將 'L' 用作秒中的毫秒).

舉幾個這個方法實用的例子(註釋是輸出結果):

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("d", 123); // "00123"

是不是很方便,讓人動心啊?哈哈,還有更多的效果!

其實format函數有些類似c語言中printf函數,一些格式字元串與 C 類似,但已進行了某些定製,以適應 Java語言,並且利用了其中一些特性.此方法提供了對布局對齊和排列的支持,以及對數值、字元串和日期/時間數據的常規格式和特定於語言環境的輸出的支持.支持諸如 byte、BigDecimal 和 Calendar 等常見 Java 類型.

產生格式化輸出的每個方法都需要格式字元串 和參數列表.格式字元串是一個 String,它可以包含固定文本以及一個或多個嵌入的格式說明符.請考慮以下示例:

Calendar c = …; String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);

格式字元串是 format 方法的第一個參數.它包含三個格式說明符 "%1$tm"、"%1$te" 和"%1$tY",它們指出應該如何處理參數以及在文本的什麼地方插入它們.格式字元串的其餘部分是包括 "Dukes Birthday: "和其他任何空格或標點符號的固定文本. 參數列表由傳遞給位於格式字元串之後的方法的所有參數組成.在上述示例中,參數列表的大小為 1,由新對象Calendar 組成.

1.常規類型、字元類型和數值類型的格式說明符的語法如下:

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

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

可選的 flags 是修改輸出格式的字符集.有效標誌的集合取決於轉換類型.

可選 width 是一個非負十進位整數,表明要向輸出中寫入的最少字元數.

可選 precision 是一個非負十進位整數,通常用來限制字元數.特定行為取決於轉換類型.

所需的 conversion 是一個表明應該如何格式化參數的字元.給定參數的有效轉換集合取決於參數的數據類型.

2.用來表示日期和時間類型的格式說明符的語法如下:

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

可選的 argument_index、flags 和 width 的定義同上.

所需的 conversion 是一個由兩字元組成的序列.第一個字元是 't' 或 'T'.第二個字元表明所使用的格式.這些字元類似於但不完全等同於那些由 GNU date 和 POSIX strftime(3c) 定義的字元.

3.與參數不對應的格式說明符的語法如下:

%[flags][width]conversion

可選 flags 和 width 的定義同上.

所需的 conversion 是一個表明要在輸出中所插內容的字元.

轉 換

轉換可分為以下幾類:

1. 常規 - 可應用於任何參數類型

2.字元 - 可應用於表示 Unicode 字元的基本類型:char、Character、byte、Byte、short 和 Short.當Character.isValidCodePoint(int) 返回 true 時,可將此轉換應用於 int 和 Integer 類型

3. 數值

1. 整數 - 可應用於 Java 的整數類型:byte、Byte、short、Short、int、Integer、long、Long 和 BigInteger

2. 浮點 - 可用於 Java 的浮點類型:float、Float、double、Double 和 BigDecimal

4. 日期/時間 - 可應用於 Java 的、能夠對日期或時間進行編碼的類型:long、Long、Calendar 和 Date.

5. 百分比 - 產生字面值 '%' ('"u0025')

6. 行分隔符 - 產生特定於平台的行分隔符

下表總結了受支持的轉換.由大寫字元(如 'B'、'H'、'S'、'C'、'X'、'E'、'G'、'A' 和'T')表示的轉換與由相應的小寫字元的轉換等同,根據流行的 Locale 規則將結果轉換為大寫形式除外.後者等同於String.toUpperCase() 的以下調用.

轉換 參數類別 說明

'b', 'B' 常規 如果參數 arg 為 null,則結果為 "false".如果 arg 是一個 boolean 值或 Boolean,則結果為 String.valueOf() 返回的字元串.否則結果為 "true".

'h', 'H' 常規 如果參數 arg 為 null,則結果為 "null".否則,結果為調用 Integer.toHexString(arg.hashCode()) 得到的結果.

's', 'S' 常規 如果參數 arg 為 null,則結果為 "null".如果 arg 實現 Formattable,則調用 arg.formatTo.否則,結果為調用 arg.toString() 得到的結果.

'c', 'C' 字元 結果是一個 Unicode 字元

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

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

'x', 'X' 整數 結果被格式化為十六進位整數

'e', 'E' 浮點 結果被格式化為用計算機科學記數法表示的十進位數

'f' 浮點 結果被格式化為十進位數

'g', 'G' 浮點 根據精度和舍入運算后的值,使用計算機科學記數形式或十進位格式對結果進行格式化.

'a', 'A' 浮點 結果被格式化為帶有效位數和指數的十六進位浮點數

't', 'T' 日期/時間 日期和時間轉換字元的前綴.請參閱日期/時間轉換.

'%' 百分比 結果為字面值 '%' ('"u0025')

'n' 行分隔符 結果為特定於平台的行分隔符

'H' 24 小時制的小時,被格式化為必要時帶前導零的兩位數,即 00 - 23.

'I' 12 小時制的小時,被格式化為必要時帶前導零的兩位數,即 01 - 12.

'k' 24 小時制的小時,即 0 - 23.

'l' 12 小時制的小時,即 1 - 12.

'M' 小時中的分鐘,被格式化為必要時帶前導零的兩位數,即 00 - 59.

'S' 分鐘中的秒,被格式化為必要時帶前導零的兩位數,即 00 - 60 ("60" 是支持閏秒所需的一個特殊值).

'L' 秒中的毫秒,被格式化為必要時帶前導零的三位數,即 000 - 999.

'N' 秒中的毫微秒,被格式化為必要時帶前導零的九位數,即 000000000 - 999999999.

'p' 特定於語言環境的 上午或下午 標記以小寫形式表示,例如 "am" 或 "pm".使用轉換前綴 'T' 可以強行將此輸出轉換為大寫形式.

'z' 相對於 GMT 的 RFC 822 格式的數字時區偏移量,例如 -0800.

'Z' 表示時區縮寫形式的字元串.Formatter 的語言環境將取代參數的語言環境(如果有).

's' 自協調世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現在所經過的秒數,即 Long.MIN_VALUE/1000 與 Long.MAX_VALUE/1000 之間的差值.

'Q' 自協調世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現在所經過的毫秒數,即 Long.MIN_VALUE 與 Long.MAX_VALUE 之間的差值.

'B' 特定於語言環境的月份全稱,例如 "January" 和 "February".

'b' 特定於語言環境的月份簡稱,例如 "Jan" 和 "Feb".

'h' 與 'b' 相同.

'A' 特定於語言環境的星期幾全稱,例如 "Sunday" 和 "Monday"

'a' 特定於語言環境的星期幾簡稱,例如 "Sun" 和 "Mon"

'C' 除以 100 的四位數表示的年份,被格式化為必要時帶前導零的兩位數,即 00 - 99

'Y' 年份,被格式化為必要時帶前導零的四位數(至少),例如,0092 等於格里高利曆的 92 CE.

'y' 年份的最后兩位數,被格式化為必要時帶前導零的兩位數,即 00 - 99.

'j' 一年中的天數,被格式化為必要時帶前導零的三位數,例如,對於格里高利曆是 001 - 366.

'm' 月份,被格式化為必要時帶前導零的兩位數,即 01 - 13.

'd' 一個月中的天數,被格式化為必要時帶前導零兩位數,即 01 - 31

'e' 一個月中的天數,被格式化為兩位數,即 1 - 31.

'R' 24 小時制的時間,被格式化為 "%tH:%tM"

'T' 24 小時制的時間,被格式化為 "%tH:%tM:%tS".

'r' 12 小時制的時間,被格式化為 "%tI:%tM:%tS %Tp".上午或下午標記 ('%Tp') 的位置可能與語言環境有關.

'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".

標誌 常規 字元 整數 浮點 日期/時間 說明

'-' y y y y y 結果將是左對齊的.

'#' y1 - y3 y - 結果應該使用依賴於轉換類型的替換形式

' ' - - y4 y - 結果總是包括一個符號

' ' - - y4 y - 對於正值,結果中將包括一個前導空格

'0' - - y y - 結果將用零來填充

',' - - y2 y5 - 結果將包括特定於語言環境的組分隔符

'(' - - y4 y5 - 結果將是用圓括弧括起來的負數

任何未明確定義為轉換的字元都是非法字元,並且都被保留,以供將來擴展使用.

日期/時間轉換

以下日期和時間轉換的後綴字元是為 't' 和 'T' 轉換定義的.這些類型相似於但不完全等同於那些由 GNU date 和 POSIXstrftime(3c) 定義的類型.提供其他轉換類型是為了訪問特定於 Java 的功能(如將 'L' 用作秒中的毫秒).

以下轉換字元用來格式化時間:

以下轉換字元用來格式化日期:

以下轉換字元用于格式化常見的日期/時間組合.

任何未明確定義為轉換的字元都是非法字元,並且都被保留,以供將來擴展使用.

標 志

下表總結了受支持的標誌.y 表示該標誌受指示參數類型支持.

1 取決於 Formattable 的定義.

2 只適用於 'd' 轉換.

3 只適用於 'o'、'x' 和 'X' 轉換.

4 對 BigInteger 應用 'd'、'o'、'x' 和 'X' 轉換時,或者對 byte 及 Byte、short 及 Short、int 及 Integer、long 及 Long 分別應用 'd' 轉換時適用.

5 只適用於 'e'、'E'、'f'、'g' 和 'G' 轉換.

任何未顯式定義為標誌的字元都是非法字元,並且都被保留,以供擴展使用.

寬度 寬度是將向輸出中寫入的最少字元數.對於行分隔符轉換,不適用寬度,如果提供寬度,則會拋出異常.

精度 對於常規參數類型,精度是將向輸出中寫入的最多字元數.

對於浮點轉換 'e'、'E' 和 'f',精度是小數點分隔符后的位數.如果轉換是 'g' 或 'G',那麼精度是舍入計算后所得數值的所有位數.如果轉換是 'a' 或 'A',則不必指定精度.

對於字元、整數和日期/時間參數類型轉換,以及百分比和行分隔符轉換,精度是不適用的;如果提供精度,則會拋出異常.

參數索引 參數索引是一個十進位整數,用於表明參數在參數列表中的位置.第一個參數由 "1$" 引用,第二個參數由 "2$" 引用,依此類推.

根據位置引用參數的另一種方法是使用 '<' ('"u003c') 標誌,這將會重用以前格式說明符的參數.例如,以下兩條語句產生的字元相同:

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);


[火星人 ] Java中String.format的用法已經有1356次圍觀

http://coctec.com/docs/java/show-post-59879.html