將數值欄位格式化為「固定兩位小數」,並妥善處理:0 → 0.00、1234 → 1,234.00、1234.5 → 1,234.50、.5 → 0.50 等邊界情況。
TO_CHAR(ROUND(salary, 2), 'FM99999999999999.00')
FM:Fill Mode,抑制前導/尾隨空白9:數字位,前導零不顯示0:數字位,前導零顯示.00:強制兩位小數缺點:salary=0時顯示.00而非0.00
DECODE(salary, 0, '0.00',
TO_CHAR(ROUND(salary, 2), 'FM99999999999999.00'))
CASE
WHEN INSTR(TO_CHAR(salary), '.') < 1 THEN TO_CHAR(salary) || '.00' -- 無小數點
WHEN INSTR(TO_CHAR(salary), '.') + 1 = LENGTH(TO_CHAR(salary))
THEN TO_CHAR(salary) || '0' -- 單位小數
ELSE TO_CHAR(ROUND(salary, 2))
END AS amount_format
COLUMN salary FORMAT L9999999999.99
-- 或
COLUMN salary FORMAT 999,999,999.99
#######
TRIM(TO_CHAR(salary, '99999999999999.99'))
-- 或
LTRIM(TRIM(TO_CHAR(salary, '00000000000000.00')), '0')
TRIM 移除格式模型產生的前導/尾隨空白9 而非 0 避免需額外 LTRIM('0')缺點:同方案一,salary=0顯示.00
DECODE(salary, 0, '0.00',
TRIM(TO_CHAR(salary, '99999999999999.99')))
| 方案 | 適用層 | 0值處理 | 效能 | 可移植性 | 維護性 |
|---|---|---|---|---|---|
| TO_CHAR+FM+DECODE | SQL/應用 | 完美 | 高 | 高 | 好 |
| CASE WHEN | SQL/應用 | 完美 | 中 | 高 | 較差 |
| COLUMN FORMAT | 僅客戶端 | 正常 | 最高 | 低 | 最好 |
| TRIM+TO_CHAR+DECODE | SQL/應用 | 完美 | 高 | 高 | 好 |
NUMBER,由 Java DecimalFormat、C# ToString("N2")、JS toFixed(2) 處理顯示,分離關注點9 的個數需 > 最大值位數,建議預留 14-16 位 (99999999999999)NLS_NUMERIC_CHARACTERS,明確指定 TO_CHAR(..., 'FM999G999D00', 'NLS_NUMERIC_CHARACTERS='',.''')
WITH test_data AS (
SELECT 0 AS salary FROM dual UNION ALL
SELECT 1234 FROM dual UNION ALL
SELECT 1234.5 FROM dual UNION ALL
SELECT 1234.56 FROM dual UNION ALL
SELECT 1234.567 FROM dual UNION ALL
SELECT .5 FROM dual UNION ALL
SELECT -100.25 FROM dual
)
SELECT
salary,
DECODE(salary, 0, '0.00', TO_CHAR(ROUND(salary,2), 'FM99999999999999.00')) AS fmt1,
DECODE(salary, 0, '0.00', TRIM(TO_CHAR(salary, '99999999999999.99'))) AS fmt4
FROM test_data;
數值格式化看似簡單,邊界條件 (0、負數、超長、區域設定) 處理不當極易產生顯示錯誤。建立專案統一的格式化函數/工具類,集中管理格式邏輯,是避免「同一欄位在不同畫面顯示不一致」的關鍵。