首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java String.format 完整指南:格式化字串語法詳解與實戰範例

     編輯:Java 相關知識

String.format 核心簽名與定位

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`

1. 通用轉換符 (適用任意物件)

2. 整數格式化 (byte, short, int, long, BigInteger)

符號含義示例
%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` 補零、`(` 負數用括號、` ,` 千分位分組 (僅十進制)、`#` 進制前綴。

3. 浮點數格式化 (float, double, BigDecimal)

轉換風格示例 (輸入 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。

4. 字符格式化

%c / %C:單字符 (char, Character, byte, short, int)。旗標僅 `-` 左對齊。

5. 日期/時間格式化 (java.util.Date, Calendar, Long, java.time.\*) — 後綴 `t`/`T`

語法:`%t` (如 `%tF`)。**強大支援 Java 8+ `LocalDateTime`/`ZonedDateTime`/`Instant`**。

類別轉換含義示例
時間H24h 時 (00-23)14
I12h 時 (01-12)02
M分 (00-59)05
S秒 (00-60)09
L毫秒 (000-999)123
N奈秒 (9 位)123456789
pAM/PM 小寫pm
zRFC 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
r12h 時間 `%tI:%tM:%tS %Tp`02:05:09 PM
D日期 `%tm/%td/%ty`01/15/24
FISO 日期 `%tY-%tm-%td`2024-01-15
c完整 `%ta %tb %td %tT %tZ %tY`Mon Jan 15 14:05:09 CST 2024

索引參數進階用法:複用、重排、Locale

// 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()); // "一月" (繁體中文月份)

最佳實踐與避坑

  1. 優先用 `String.format` 而非拼接: 可讀性高、效能可接受 (內部用 `Formatter`)、支援複雜格式。
  2. 貨幣/金額必用 `BigDecimal` + `NumberFormat`/`String.format`: 避免 `double` 精度丟失。`String.format("%,.2f", price)` 配合 `RoundingMode.HALF_UP`。
  3. 日期格式化首選 `DateTimeFormatter` (Java 8+): 線程安全、不可變、語義豐富 (ISO_DATE_TIME、自定義模式)。`String.format("%tF")` 適合簡單日誌/輸出。
  4. 避免過度格式化: 高頻熱點路徑 (日誌框架、序列化) 用專用高效庫 (Log4j2 Parameterized Messages, Jackson `JsonGenerator`)。
  5. 異常處理: `IllegalFormatException` (格式字串錯誤)、`FormatFlagsConversionMismatchException` (旗標衝突) — 單元測試覆蓋格式化邏輯。

`String.format` 是 Java 開發者工具箱中的「瑞士軍刀」—— 功能全、語法嚴、擴展性強。掌握其語法全景與索引參數技巧,能讓輸出代碼既優雅又健壯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved