TO_CHAR(number, fmt, nlsparam) 是 Oracle 將數值轉為格式化字串的核心函式。本文深入解析格式模型元素、FM 修飾詞行為、NLS 參數覆蓋機制,並針對「小數位不足補零」、「整數不顯示小數點」、「負號/括號表示」等實戰需求提供標準寫法。
| 元素 | 功能 | 範例 | 結果 |
|---|---|---|---|
| 9 | 數字位(前導空白) | TO_CHAR(123, '9999') | ' 123' |
| 0 | 數字位(前導零) | TO_CHAR(123, '0000') | '0123' |
| . | 小數點位置 | TO_CHAR(1.2, '9.99') | '1.20' |
| , | 千分位分隔(僅左側) | TO_CHAR(1234, '9,999') | '1,234' |
| $ | 美元符號(固定 $) | TO_CHAR(123, '$999') | '$123' |
| L | 本地貨幣符號(依 NLS) | TO_CHAR(123, 'L999') | 'NT$123' (繁中環境) |
| MI | 負號後置 | TO_CHAR(-123, '999MI') | '123-' |
| PR | 負數用括號 | TO_CHAR(-123, '999PR') | '<123>' |
| FM | 移除前導/尾隨空白與零 | TO_CHAR(1.2, 'FM9.99') | '1.2' |
| B | 零值顯示空白 | TO_CHAR(0, 'B999') | ' ' |
SELECT TO_CHAR(0.123, '0.000') FROM dual; -- '0.123'
SELECT TO_CHAR(1.1, '0.000') FROM dual; -- '1.100'
SELECT TO_CHAR(100, '0.000') FROM dual; -- '100.000'
FM 會殘留小數點,需搭配 RTRIM:
SELECT RTRIM(TO_CHAR(val, 'FM999.999'), '.') FROM dual;
-- val=1.2 → '1.2'
-- val=100 → '100' (無小數點)
-- val=100.00 → '100'
SELECT TO_CHAR(-12345.67, 'FM L999,999.99PR') FROM dual;
-- 結果:'NT$<12,345.67>' (繁中環境 NLS_CURRENCY=NT$)
-- 欧洲格式:小數點用逗號,千分位用點
SELECT TO_CHAR(12345.67, '99G999D99',
'NLS_NUMERIC_CHARACTERS='',.''') FROM dual;
-- 結果:'12.345,67'
nlsparam(最高)ALTER SESSION SET NLS_NUMERIC_CHARACTERS=...NLS_NUMERIC_CHARACTERS.,)FM0.999 仍會輸出前導零,FM 僅移除空白與尾隨零。MI/PR 僅影響負數,正數不會加正號;若需正負號皆顯示,用 S 元素(S999 → +123/-123)。EEEE 僅適用於極大/極小數值,一般報表勿用。掌握 TO_CHAR 格式模型組合技巧,即可輸出符合財務、報表、介面各種嚴格格式需求的字串。