Java格式化輸出
阿新 • • 發佈:2019-02-09
對 Java
格式化輸出的總結,主要是對 printf
和 format
方法的歸納。
設計到的主要類為 java.util.Formatter
,本文主要是對 Java8
中相關 API
的簡單翻譯。
Java
中字串的樣式格式化主要是基於 java.util.Formatter
,這個類提供了佈局和對齊,數字的常見格式,字串,各種日期時間和基於特定語言環境的輸出。
格式化程式的執行緒安全需要使用者自己負責。
概要 (Summary)
格式化字串語法 (Format String Syntax)
每種格式化輸出的方法,都需要一個格式化字串和一個引數列表,格式化字串中包含固定文字和一個或多個格式說明符
格式說明符的一般語法為:
%[argument_index$][flags][width][.precision]conversion
argument_index
:可選,是一個十進位制整數,表示引數列表中引數的位置。第一個引數由1$
引用,第二個由2$
引用等flags
:可選,是一組修改輸出格式的字元,有效標誌集取決於轉換型別width
:可選,是一個正的十進位制整數,表示要寫入輸出的最小字元數.precision
:可選,是一個非負十進位制整數,通常用來限制字元數。特定行為取決於轉換型別conversion
:必須,表明應該如何格式化引數的字元,給定引數的有效轉換集取決於引數的資料型別
格式說明符對日期時間的語法為:
%[argument_index$][flags][width]conversion
conversion
:由兩個字元組成,第一個字元是t
或者T
,第二個字元表示使用的格式
不符合引數的格式說明符語法為:
%[flags][width]conversion
conversion
:一個表示在輸出中插入內容的字元
轉換符 (Conversions)
conversion
主要分為以下幾個類別:
- General :應用於任何引數型別
- Character :應用於表示
Unicode
字元的基本型別,char, Character, byte, Byte, short, and Short
Character.isValidCodePoint(int)
返回為true
時,也可應用於int and Integer
- Numeric:整型和浮點型
- Date/Time:應用於能夠對日期或者時間進行編碼的型別
long, Long, Calendar, Date and TemporalAccessor
- Percent:百分比,產生字面值
% (\u0025)
- Line Separator:行分隔符,產生特定平臺的行分隔符
有的轉換符有大寫的形式,表示輸出的也是轉換成大寫輸出。
轉換符 | 說明 |
---|---|
'b' , 'B' |
布林型輸出,引數為 null 結果為 false |
'h' , 'H' |
雜湊值,引數為 null 結果為 null |
's' , 'S' |
字串 |
'c' , 'C' |
字元 |
'd' |
十進位制整數 |
'o' |
八進位制整數 |
'x' , 'X' |
十六進位制整數 |
'e' , 'E' |
指數浮點數 |
'f' |
定點浮點數 3.55000 |
'g' , 'G' |
通用浮點數 |
'a' , 'A' |
十六進位制浮點數 |
't' , 'T' |
日期和時間 |
'%' |
百分號 % |
'n' |
與平臺有關的行分隔符 |
日期時間轉換符 (Date/Time Conversions)
格式化時間轉換符
轉換符 | 型別 | 說明 |
---|---|---|
'H' |
兩位數 小時數 | 00 ~ 23 |
'I' |
兩位數 小時數 | 01 ~ 12 |
'k' |
小時數 | 0 ~ 23 |
'l' |
小時數 | 1 ~ 12 |
'M' |
兩位數 分鐘 | 00 ~ 59 |
'S' |
兩位數 秒 | 00 ~ 60 |
'L' |
毫秒 | 000 ~ 999 |
'N' |
納秒 | 000000000 - 999999999 |
'p' |
上下午標誌 | “am ” or “pm ” |
'z' |
從 GMT 起, RFC822 數字位移 |
-0800 |
'Z' |
時區 | PST |
's' |
從 1 January 1970 00:00:00 UTC起的秒數 |
Long.MIN_VALUE/1000 to Long.MAX_VALUE/1000 |
'Q' |
從 1 January 1970 00:00:00 UTC起的毫秒數 |
Long.MIN_VALUE to Long.MAX_VALUE |
格式化日期轉換符
轉換符 | 型別 | 說明 |
---|---|---|
'B' |
完整的月份名稱 | "January" , "February" |
'b' ,'h' |
月份名稱簡寫 | "Jan" , "Feb" |
'A' |
星期的全稱 | "Sunday" , "Monday" |
'a' |
星期的簡寫 | "Sun" , "Mon" |
'C' |
年的前兩位數字 | 00 - 99 |
'Y' |
年份,四位數字 | 2018 |
'y' |
年份的後兩位數字 | 00 - 99 |
'j' |
年中的日子 | 001 - 366 |
'm' |
月份 | 01 - 13 |
'd' |
月中的日子,兩位數 | 01 - 31 |
'e' |
月中的日子 | 1 - 31 |
常用日期格式
轉換符 | 說明 |
---|---|
'R' |
Time formatted for the 24-hour clock as "%tH:%tM" |
'T' |
Time formatted for the 24-hour clock as "%tH:%tM:%tS" . |
'r' |
Time formatted for the 12-hour clock as "%tI:%tM:%tS %Tp" . The location of the morning or afternoon marker ('%Tp' ) may be locale-dependent. |
'D' |
Date formatted as "%tm/%td/%ty" . |
'F' |
ISO 8601 complete date formatted as "%tY-%tm-%td" . |
'c' |
Date and time formatted as "%ta %tb %td %tT %tZ %tY" , e.g. "Sun Jul 20 16:17:00 EDT 1969" . |
標誌位 (Flags)
Flag | 應用範圍 | 說明 |
---|---|---|
‘-‘ | 全部 | 左對齊 |
‘#’ | Integral 和Floating Point |
整型顯示進位制字首(0x或0 ),浮點型顯示小數點 |
‘+’ | Integral 和Floating Point |
顯示正負符號 |
’ ‘ | Integral 和Floating Point |
空格,正數前面補充空格 |
‘0’ | Integral 和Floating Point |
數字前面補0 |
‘,’ | Integral 和Floating Point |
新增分組分隔符,如 3,333.33 |
‘(‘ | Integral 和Floating Point |
將負數用小括號括起來,如 -33 變成 (33) |
寬度 (Width)
將輸出的最少的字元數
精度 (Precision)
general argument types
:對常規的引數,輸出的最大字元數
conversions 'a', 'A', 'e', 'E', and 'f'
:浮點型資料,小數點後的位數
conversion 'g' or 'G'
:浮點型資料,四捨五入後的所有位數
引數索引 (Argument Index)
是一個從 1
開始的十進位制整數,第一個是 1$
,依次類推
<
這個標誌可以重用以前的引數
下面兩條語句生成的字串相同:
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);