JDK 5 在 PrintStream、PrintWriter、String 中新增四個格式化方法:
format(String fmt, Object... args)printf(String fmt, Object... args) (format 同義)format(Locale loc, String fmt, Object... args)printf(Locale loc, String fmt, Object... args)Formatter 類提供更底層的控制,支援 StringBuilder 緩衝區。
%[argument_index$][flags][width][.precision]conversion
| 元素 | 說明 | 範例 |
|---|---|---|
| argument_index | 參數索引 (1-based),%1$ 表示第一個參數 | %1$d %1$d 重複使用 |
| flags | '-' 左對齊, '+' 正負號, '0' 補零, ',' 千分位, '(' 負數括號 | %,.2f |
| width | 最小字元寬度 | %10d |
| precision | 小數位數或字串最大長度 | %.2f |
| conversion | 類型轉換字元 | 見下表 |
| 字元 | 類型 | 說明 |
|---|---|---|
| d | 整數 | 十進制 |
| f | 浮點數 | 十進制浮點 |
| e | 浮點數 | 科學記號 |
| x | 整數 | 十六進制小寫 |
| s | 任意 | 字串 (toString()) |
| c | 字元 | Unicode 字元 |
| t | 日期/時間 | 需搭配後綴 (見下) |
| b | 布林 | true/false |
| % | - | 輸出 '%' |
| n | - | 平台相關換行符 |
t)tR - 24小時制 HH:MMtA - 完整星期名tB - 完整月份名te - 月份中的日期 (1-31)tY - 四位年份< - 復用前一個參數 (避免重複傳遞)System.out.printf("Pi = %.2f, e = %.4f%n", Math.PI, Math.E);
// Pi = 3.14, e = 2.7183
formatter.format("Pi = %1$.2f, e = %2$.2f, Pi again = %1$.2f", Math.PI, Math.E);
// Pi = 3.14, e = 2.72, Pi again = 3.14
Calendar now = Calendar.getInstance();
System.out.printf("Now: %tR on %tA, %tB %te, %tY%n", now, now, now, now, now);
// 使用 < 簡化
System.out.printf("Now: %tR on %<tA, %<tB %<te, %<tY%n", now);
Formatter f = new Formatter(sb, Locale.FRANCE);
f.format("Pi = %.2f", Math.PI); // 輸出 "Pi = 3,14" (法文逗號分隔)
StringBuilder sb = new StringBuilder();
Formatter formatter = new Formatter(sb);
formatter.format("User: %s, Age: %d, Active: %b", "Alice", 30, true);
System.out.println(sb.toString());
JDK 5 的格式化 API 將 C 風格 printf 的強大功能引入 Java,支援型別安全、Locale 敏感、參數復用與靈活的輸出目標,是取代繁瑣字串串接的最佳選擇。