這是一個非常常見的需求,也是 `DecimalFormat` 類別設計的重點之一。要實現「有小數時印出小數,沒有小數時只印出整數,且不帶小數點或尾隨零」,您只需要在模式中使用 **`#` (井號)** 來表示小數部分。
### 關鍵模式:`#,##0.##`
讓我們分解這個模式:
1. **`#,##0` (小數點左邊):**
* `#` 和 `,` 用於千位分隔符,如果數字很大,會自動添加逗號。
* `0` 確保至少有一位整數(例如,`0.5` 會被格式化為 `.5`,但使用 `0` 則為 `0.5`)。
2. **`.` (小數點):** 分隔符。
3. **`##` (小數點右邊):**
* **關鍵點!** 使用 **`#`** 表示這是一位**可選的數字**。如果實際數值在該位置是零,或者該位之後所有數字都是零,則 **`#`** 所代表的數字、以及它前面的小數點,都會被**省略**。
### 範例程式碼
```java
import java.text.DecimalFormat;
public class OptionalDecimalDemo {
public static void main(String[] args) {
// 使用模式:#.## (整數部分使用 # 讓 0.5 輸出為 .5,但我們通常會使用 0.)
// 更通用的模式是 #,##0.##,可以處理整數零值和千位分隔符。
DecimalFormat formatter = new DecimalFormat("#,##0.##");
// 測試一:精確的整數
double value1 = 1234.0;
String result1 = formatter.format(value1);
System.out.println(value1 + " => " + result1);
// 輸出: 1234.0 => 1,234 (沒有小數點)
// 測試二:帶有小數點
double value2 = 1234.567;
String result2 = formatter.format(value2);
System.out.println(value2 + " => " + result2);
// 輸出: 1234.567 => 1,234.57 (只保留兩位,並四捨五入)
// 測試三:小數部分有尾隨零
double value3 = 100.20;
String result3 = formatter.format(value3);
System.out.println(value3 + " => " + result3);
// 輸出: 100.2 => 100.2 (尾隨的零被移除)
// 測試四:零值
double value4 = 0.0;
String result4 = formatter.format(value4);
System.out.println(value4 + " => " + result4);
// 輸出: 0.0 => 0 (沒有小數點)
// 測試五:小數少於模式設定位數
double value5 = 5.1;
String result5 = formatter.format(value5);
System.out.println(value5 + " => " + result5);
// 輸出: 5.1 => 5.1
}
}
```
### 🔹 模式詳解:
| 符號 | 位置 | 目的 |
| :--- | :--- | :--- |
| **`#`** | 整數/小數部分 | **表示數字,但在數組邊界處可省略。** 在小數點右側,這意味著它只在有實際非零小數位時才顯示。 |
| **`0`** | 整數/小數部分 | **表示數字,即使為零也會強制顯示。** 在小數點右側,這會強制顯示該位的小數,即使是零。 |
| **`#,##0.##`** | 組合 | 透過將小數點右側全部設為 `#`,您有效地告訴格式化工具:「如果小數部分的值為零,請省略小數點及其後的所有內容;如果小數部分不為零,則最多顯示兩位。」
如果您希望最多顯示四位小數,模式就變成:`#,##0.####`。