貨幣顯示、科學計數、百分比、分組分隔符……數字呈現場景多變。java.text.DecimalFormat 以模式字串靈活定義格式,是 Java 處理數字展示的利器。
| 符號 | 含義 | 示例 |
|---|---|---|
0 | 數字佔位,不足補 0 | 00.00 → 03.14 |
# | 數字佔位,不足不補 | ##.## → 3.14 |
. | 小數點(按 Locale 解析) | |
, | 分組分隔符(千分位) | ,### → 1,000 |
E | 科學計數法分隔符 | #.###E0 → 1.23E3 |
% | 百分比(乘 100 並加 %) | #% → 123% |
';' | 分隔正負數格式 | #.##;(#.##) |
double pi = 3.1415927;
long lightSpeed = 299792458L;
// 基礎格式化
new DecimalFormat("0").format(pi); // "3"
new DecimalFormat("0.00").format(pi); // "3.14"
new DecimalFormat("00.000").format(pi); // "03.142"
new DecimalFormat("#").format(pi); // "3"
new DecimalFormat("#.##%").format(pi); // "314.16%"
// 科學計數法
new DecimalFormat("#.#####E0").format(lightSpeed); // "2.99792E8"
new DecimalFormat("00.####E0").format(lightSpeed); // "29.9792E7"
// 千分位分組
new DecimalFormat(",###").format(lightSpeed); // "299,792,458"
// 嵌入文本
new DecimalFormat("光速大小為每秒 ,### 米。").format(lightSpeed);
// "光速大小為每秒 299,792,458 米。"
不同地區小數點、分組符號不同(如德語用逗號作小數點)。使用 DecimalFormatSymbols 顯式控制:
DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.GERMAN);
symbols.setDecimalSeparator(',');
symbols.setGroupingSeparator('.');
DecimalFormat df = new DecimalFormat("#,###.00", symbols);
預設 RoundingMode.HALF_EVEN(銀行家算法)。財務場景常需 HALF_UP:
df.setRoundingMode(RoundingMode.HALF_UP);
DecimalFormat 非線程安全。多線程環境下:
ThreadLocal 緩存實例NumberFormat.getInstance() 獲取不可變格式化器掌握 0/# 佔位符組合、科學計數、分組分隔、百分比等核心模式,即可覆蓋 95% 數字展示需求。記住:格式化僅影響展示,不改變數值本身;涉及精度計算請用 BigDecimal。