public static String format(String format, Object... args)
public static String format(Locale l, String format, Object... args)
JDK 1.5 引入,模仿 C `printf` 但**更強大**:支援**索引參數** (`%1$s`)、**任意順序複用**、**豐富類型專用格式化** (日期、BigDecimal、枚舉等)、**Locale 敏感**。是 Java 格式化輸出**首選工具** (優於 `StringBuilder` 拼接、`Formatter` 直接使用)。
通用語法:`%[argument_index$][flags][width][.precision]conversion`
| 符號 | 含義 | 示例 | |
|---|---|---|---|
%s / %S | 任意物件 `toString()` / 大寫 | `String.format("%s", null)` → `"null"` | |
%h / %H | 物件 `hashCode()` 十六進制 / 大寫 | `String.format("%h", "abc")` → `"1874467"` | |
%% | 輸出單個 `%` | `String.format("100%%")` → `"100%"` | |
%n | **平台無關換行符** (Win `\r\n`, Linux `\n`) | `String.format("A%nB")` → 跨平台正確換行 |
| 轉換 | 進制 | 示例 (輸入 -3123) |
|---|---|---|
d | 十進制 | `%,09d` → `-0,003,123` (分組、補零、寬度 9) |
o | 八進制 | `%#o` → `-07233` (旗標 `#` 加前綴 `0`) |
x / X | 十六進制 | `%#X` → `-0XC33` (旗標 `#` 加前綴 `0X`) |
旗標 (Flags): `-` 左對齊、`+` 正數顯示 `+`、` ` 正數前空格、`0` 補零、`(` 負數用括號、` ,` 千分位分組 (僅十進制)、`#` 進制前綴。
| 轉換 | 風格 | 示例 (輸入 1234.567) |
|---|---|---|
f | 定點十進制 | `%,.2f` → `1,234.57` (分組、精度 2) |
e / E | 科學計數法 | `%.2E` → `1.23E+03` |
g / G | 通用 (自動選 f/e) | `%.3g` → `1.23E+03` (精度 3 位有效數字) |
a / A | 十六進制浮點數 | `%a` → `0x1.34p10` (IEEE 754 精確表示) |
精度 `.precision` 控制小數位 (f) 或有效數字 (g/e)。旗標同整數,`( 負數括號僅適用 e/E/f/g/G/a/A。
%c / %C:單字符 (char, Character, byte, short, int)。旗標僅 `-` 左對齊。
語法:`%t
| 類別 | 轉換 | 含義 | 示例 |
|---|---|---|---|
| 時間 | H | 24h 時 (00-23) | 14 |
I | 12h 時 (01-12) | 02 | |
M | 分 (00-59) | 05 | |
S | 秒 (00-60) | 09 | |
L | 毫秒 (000-999) | 123 | |
N | 奈秒 (9 位) | 123456789 | |
p | AM/PM 小寫 | pm | |
z | RFC 822 時區 | +0800 | |
| 日期 | B | 月份全名 | January |
b / h | 月份簡稱 | Jan | |
A | 星期全名 | Monday | |
a | 星期簡稱 | Mon | |
Y | 年 (4 位+) | 2024 | |
y | 年後兩位 | 24 | |
m | 月 (01-13) | 01 | |
d | 日 (01-31) | 15 | |
| 組合 | R | 時間 `%tH:%tM` | 14:05 |
T | 時間 `%tH:%tM:%tS` | 14:05:09 | |
r | 12h 時間 `%tI:%tM:%tS %Tp` | 02:05:09 PM | |
D | 日期 `%tm/%td/%ty` | 01/15/24 | |
F | ISO 日期 `%tY-%tm-%td` | 2024-01-15 | |
c | 完整 `%ta %tb %td %tT %tZ %tY` | Mon Jan 15 14:05:09 CST 2024 |
// 1. 索引複用:同一參數多處格式化
String.format("%1$tF %1$tT %1$tZ", new Date());
// 2024-01-15 14:05:09 CST
// 2. 參數重排:格式化字串決定順序,非參數順序
String.format("第二個: %2$s, 第一個: %1$s", "A", "B");
// "第二個: B, 第一個: A"
// 3. 精確控制寬度對齊 (表格輸出)
String.format("|%-10s|%10.2f|%n", "Item", 123.4);
// |Item | 123.40|
// 4. Locale 敏感 (數字分組、貨幣、日期語言)
String.format(Locale.US, "%,.2f", 12345.6); // "12,345.60"
String.format(Locale.FRANCE, "%,.2f", 12345.6); // "12 345,60" (法文空格分組、逗號小數點)
String.format(Locale.TAIWAN, "%tB", new Date()); // "一月" (繁體中文月份)
`String.format` 是 Java 開發者工具箱中的「瑞士軍刀」—— 功能全、語法嚴、擴展性強。掌握其語法全景與索引參數技巧,能讓輸出代碼既優雅又健壯。