計算比率時,小數點前的零會被隱藏:
SELECT ROUND((DISCOUNT/AMOUNT), 2) FROM DUAL;
-- 結果:.45 (預期:0.45)
SELECT DECODE(
TRUNC(1/100), 0,
REPLACE(1/100, '.', '0.'),
TO_CHAR(1/100)
) FROM DUAL;
邏輯:整數部分為 0 時,將小數點前補零;否則直接轉字串。適用任意數值範圍。
SELECT RTRIM(TO_CHAR(1/100, 'FM99999999990.9999'), '.') FROM DUAL;
關鍵格式元素:
FM:抑制前導/尾隨空白0:強制顯示零(關鍵!)9:選擇性數字位RTRIM(..., '.'):移除純整數時的尾隨小數點| 維度 | 方案一 (DECODE) | 方案二 (TO_CHAR) |
|---|---|---|
| 複雜度 | 較高 | 簡潔 |
| 通用性 | 任意數值範圍 | 需預估最大位數 |
| 風險 | 低 | 位數不足顯示 ######## |
| 可讀性 | 一般 | 標準格式化語法 |
-- 格式位數不足
SELECT RTRIM(TO_CHAR(200, 'FM90.9999'), '.') FROM DUAL;
-- 結果:######## (超過格式定義的 2 位整數)
修正:格式模板整數部分需覆蓋最大可能值,如 FM99999999990.9999。
-- 標準化百分比顯示函數
CREATE OR REPLACE FUNCTION FMT_PCT(P_NUM NUMBER, P_SCALE NUMBER DEFAULT 2)
RETURN VARCHAR2 IS
BEGIN
RETURN RTRIM(TO_CHAR(P_NUM, 'FM99999999990.' || RPAD('9', P_SCALE, '9')), '.');
END;
/
-- 使用範例
SELECT FMT_PCT(0.4567, 4) FROM DUAL; -- 0.4567
SELECT FMT_PCT(1.2, 2) FROM DUAL; -- 1.20
SELECT FMT_PCT(100, 0) FROM DUAL; -- 100
| 需求 | 格式字串 | 範例輸入 | 輸出 |
|---|---|---|---|
| 千分位+2位小數 | FM999,999,990.00 | 1234567.89 | 1,234,567.89 |
| 貨幣符號 | FM$999,999,990.00 | 1234.5 | $1,234.50 |
| 科學記號 | 9.99EEEE | 12345 | 1.23E+04 |
| 前導零補齊 6 位 | FM000000 | 45 | 000045 |