再探Java基礎——String.format(String format, Object… args)的使用


最近看到類似這樣的一些代碼:String.format("參數%s不能為空", "birthday"); 以前還沒用過這功能不知咐意思,后研究了一下,詳細講解如下。

 

public static String format(String format, Object... args)的功能非常強大,用法非常靈活。主要的意思是返回指定的格式化的字符串。Format參數為格式字符串語法如下:

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

“[]”里的參數表示可選。

可選的 argument_index :下標是一個十進制整數,用於表明參數在參數列表中的位置。

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

可選 width 最小寬度是一個非負十進制整數,表明要向輸出中寫入的最少字符數。

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

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

 

上面解釋比較枯燥,代碼舉例如下;

Eg1:說明argument_index和width

System.out.println(msg);

String s =  String.format("this is a %2$s %1$s %s %s test", "java", "C++");

this is a C++ java java C++ test

Eg2.說明 flags

System.out.println(String.format("%1$,09d", -3872));

System.out.println(String.format("%1$,010d", -3872));

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

System.out.println(String.format("%1$9d", -14));

System.out.println(String.format("%1$-9d", -14));

System.out.println(String.format("%1$(9d", -14));

System.out.println(String.format("%1$#9x", 31));

結果:

-0003,872

-00003,872

00003,872

      -14

-14     

     (14)

     0x1f

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

標志

常規

字符

整數

浮點

日期/時間

說明

'-'

y

y

y

y

y

結果將是左對齊的。

'#'

y1

-

y3

y

-

結果應該使用依賴於轉換類型的替換形式

'+'

-

-

y4

y

-

結果總是包括一個符號

' '

-

-

y4

y

-

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

'0'

-

-

y

y

-

結果將用零來填充

','

-

-

y2

y5

-

結果將包括特定於語言環境的組分隔符

'('

-

-

y4

y5

-

結果將是用圓括號括起來的負數

 

Eg3:說明conversion

System.out.println(String.format("this is:%s %s", "string", "format"));

System.out.println(String.format("%b, %b, %b, %b, %b, %b", "true",true, false, null, 0>1, 1, ""));

System.out.println(String.format("%o", 31));

System.out.println(String.format("%x", 31));

System.out.println(String.format("%e", 12345.6987));

System.out.println(String.format("%a", 12345.6987));

System.out.println(String.format("%c, %c, %c, %c", 'a', 'b', 48, 98));

結果:

this is:string format

true, true, false, false, false, true

37

1f

1.234570e+04

0x1.81cd96f0068dcp13

a, b, 0, b

標志的說明:

轉換

參數類別

說明

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

行分隔符

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

 

String msg = String.format("參數%s不能為空", "birthday");

System.out.println(msg);

 

Eg4:格式化日期

Calendar c = Calendar.getInstance();

String data_str = String.format("today is: %1$tY/%1$tm/%1$te, now time is %1$tH:%1$tM:%1$tS", c);

結果:

today is: 2013/10/31, now time is 17:36:49

 

日期類標志的說明:

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

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

'H'

'\u0048'

24 小時制的小時,被格式化為必要時帶前導零的兩位數,即 00 - 23。00 對應午夜。

'I'

'\u0049'

12 小時制的小時,被格式化為必要時帶前導零的兩位數,即 01 - 12。01 對應於 1 點鍾(上午或下午)。

'k'

'\u006b'

24 小時制的小時,即 0 - 23。0 對應於午夜。

'l'

'\u006c'

12 小時制的小時,即 1 - 12。1 對應於上午或下午的一點鍾。

'M'

'\u004d'

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

'S'

'\u0053'

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

'L'

'\u004c'

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

'N'

'\u004e'

秒中的毫微秒,被格式化為必要時帶前導零的九位數,即 000000000 - 999999999。此值的精度受基礎操作系統或硬件分析的限制。

'p'

'\u0070'

特定於語言環境的上午或下午標記以小寫形式表示,例如 "am" 或 "pm"。使用轉換前綴 'T' 可以強行將此輸出轉換為大寫形式。(注意,'p' 產生的輸出是小寫的。而GNU date 和 POSIX strftime(3c) 產生的輸出是大寫的。)

'z'

'\u007a'

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

'Z'

'\u005a'

表示時區的縮寫形式的字符串。

's'

'\u0073'

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

'Q'

'\u004f'

自協調世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現在所經過的毫秒數,即 Long.MIN_VALUE 與 Long.MAX_VALUE 之間的差值。此值的精度受基礎操作系統或硬件分析的限制。

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

'B'

'\u0042'

特定於語言環境的完整月份名稱,例如 "January" 和 "February"。

'b'

'\u0062'

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

'h'

'\u0068'

與 'b' 相同。

'A'

'\u0041'

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

'a'

'\u0061'

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

'C'

'\u0043'

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

'Y'

'\u0059'

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

'y'

'\u0079'

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

'j'

'\u006a'

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

'm'

'\u006d'

月份,被格式化為必要時帶前導零的兩位數,即 01 - 13,其中 "01" 是一年的第一個月,("13" 是支持陰歷所需的一個特殊值)。

'd'

'\u0064'

一個月中的天數,被格式化為必要時帶前導零的兩位數,即 01 - 31,其中 "01" 是一個月的第一天。

'e'

'\u0065'

一個月中的天數,被格式化為兩位數,即 1 - 31,其中 "1" 是一個月中的第一天。

以下轉換字符用於格式化常見的日期/時間組合。

'R'

'\u0052'

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

'T'

'\u0054'

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

'r'

'\u0072'

12 小時制的時間,被格式化為 "%tI:%tM:%tS %Tp"。上午或下午標記 ('%Tp') 的位置可能與地區有關。

'D'

'\u0044'

日期,被格式化為 "%tm/%td/%ty"。

'F'

'\u0046'

ISO 8601 格式的完整日期,被格式化為 "%tY-%tm-%td"。

'c'

'\u0063'

日期和時間,被格式化為 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969"。

 

具體的自個再看文檔去吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM