// 默認三位分隔 (依賴 Locale)
DecimalFormat formatter = new DecimalFormat();
String result = formatter.format(1000000); // "1,000,000" (US Locale) / "1.000.000" (German Locale)
// 顯式指定分組大小 (每 N 位分隔)
DecimalFormat df = new DecimalFormat();
df.setGroupingSize(3); // 默認即 3
df.setGroupingUsed(true);
String s = df.format(value);
import java.text.DecimalFormat;
import java.util.Locale;
public class NumberFormatDemo {
public static void main(String[] args) {
long value = 1_000_000_000L;
// 1. 默認 Locale (系統環境)
System.out.println("默認: " + new DecimalFormat().format(value));
// 2. 指定 Locale (強制英文分隔符)
System.out.println("US: " + NumberFormat.getNumberInstance(Locale.US).format(value));
System.out.println("DE: " + NumberFormat.getNumberInstance(Locale.GERMANY).format(value));
System.out.println("CN: " + NumberFormat.getNumberInstance(Locale.CHINA).format(value));
// 3. 自定義模式 (最靈活)
DecimalFormat custom = new DecimalFormat("#,###"); // 整數分組
System.out.println("自定義: " + custom.format(value));
// 4. 含小數
DecimalFormat withDecimal = new DecimalFormat("#,##0.00");
System.out.println("兩位小數: " + withDecimal.format(1234567.891)); // "1,234,567.89"
// 5. 科學計數法
DecimalFormat sci = new DecimalFormat("0.###E0");
System.out.println("科學記數: " + sci.format(value)); // "1.000E9"
}
}
| 符號 | 含義 | 示例 (1234.5) |
|---|---|---|
0 | 強制數字位 (不足補 0) | 0000.00 → 1234.50 |
# | 可選數字位 (不補 0) | ####.## → 1234.5 |
, | 分組分隔符 (按 Locale 顯示為 , . 空格等) | #,### → 1,234 |
. | 小數點 (按 Locale 顯示為 . 或 ,) | #.00 → 1234.50 |
E | 科學計數法 | 0.00E0 → 1.23E3 |
% | 百分比 (值乘 100 並加 %) | #% → 123450% |
¤ | 貨幣符號 | ¤#,##0.00 → $1,234.50 |
// 標準分組: 3 位 (1,000,000,000)
// 印度分組: 3,2,2... (1,00,00,00,000)
DecimalFormat indian = new DecimalFormat("#,##,##0");
indian.setGroupingSize(3); // 主分組
// 注意: DecimalFormat 僅支援固定分組大小,無法直接實現 3-2-2 變長分組
// 變長分組需手工字符串處理或使用 ICU4J
DecimalFormat / NumberFormat 非線程安全。
ThreadLocal<DecimalFormat> 緩存實例synchronized 包裝 (性能差)
NumberFormat compact = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
compact.setMaximumFractionDigits(1);
System.out.println(compact.format(1_000_000)); // "1M"
System.out.println(compact.format(1_234_567)); // "1.2M"
System.out.println(compact.format(1_000_000_000)); // "1B"
Java 數字分組格式化核心是 DecimalFormat / NumberFormat.getNumberInstance(Locale)。一行代碼 即可實現標準三位分隔:NumberFormat.getNumberInstance(Locale.US).format(value)。關鍵注意:Locale 決定分隔符樣式、DecimalFormat 非線程安全、自定義模式靈活控制小數/科學記數/貨幣。