1. 程式人生 > >Java格式化輸出

Java格式化輸出

Java 格式化輸出的總結,主要是對 printfformat 方法的歸納。

設計到的主要類為 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 應用範圍 說明
‘-‘ 全部 左對齊
‘#’ IntegralFloating Point 整型顯示進位制字首(0x或0),浮點型顯示小數點
‘+’ IntegralFloating Point 顯示正負符號
’ ‘ IntegralFloating Point 空格,正數前面補充空格
‘0’ IntegralFloating Point 數字前面補0
‘,’ IntegralFloating Point 新增分組分隔符,如 3,333.33
‘(‘ IntegralFloating 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);