Java 5.0 終於原生支援 C 風格的格式化輸出,告別 firstName + " " + lastName 這類低效拼接。核心在於 java.util.Formatter 類,它依據格式字符串(如 "%1$s %2$s")與參數列表,產出格式化結果。格式化語法兼容 printf 風格,支援精度、寬度、對齊、日期時間、參數索引等豐富特性。
Appendable 的目標對象(StringBuilder、FileWriter、PrintStream 等)。format(String format, Object... args) 或帶 Locale 重載,將結果寫入目標。StringBuilder(非線程安全,單線程首選)與 StringBuffer(線程安全)是最常用目標。範例:
StringBuilder sb = new StringBuilder();
Formatter fmt = new Formatter(sb, Locale.US);
fmt.format("PI = %12.10f", Math.PI);
System.out.println(fmt); // 輸出 Appendable 內容
System.out、System.err 皆為 PrintStream,新增 format() 與 printf()(內部委託 format()),直接輸出至控制台:
System.out.format("Today is %1$tB %1$te, %1$tY.", Calendar.getInstance());
// Today is April 2, 2004.
String.format() 則直接返回格式化後的字符串,無需手動構建 Formatter 實例,適合簡單場景。
若希望自定義類支援 %s 等格式化規範(寬度、精度、左對齊),需實現 java.util.Formattable 的唯一方法:
void formatTo(Formatter formatter, int flags, Integer width, Integer precision)
範例展示了 MyObject 如何根據 precision 截斷名稱、根據 width 与 Formattable.LEFT_JUSTIFY 標誌填充空格,實現與內建類型一致的格式化行為。
IllegalFormatException(C 語言僅產生未定義行為)。Formatter Javadoc 中的完整格式化語法表(日期/時間轉換符 %tX、參數索引 %n$ 等)。Formattable,配合 toString(),賦予其優雅的格式化輸出能力。