数値用の書式モデル
主な用途は TO_CHAR や TO_NUMBER 関数などにおいてフォーマット文字列として使用する。
⇒ 日付書式
書式 修飾子
修飾子FM とFX を使用して、符号の表示、0や空白の埋め方および書式検査の制御が可能。
FX,FM は便利な修飾子のわりに、あまり知られていない。(使われていないだけかもしれない)
└ 'vNum := TRIM(TO_CHAR(number));' のようなソースを見ることもある。
※ TO_CHAR ファンクション、TO_datetime ファンクションと SQL*Plus の COLUMN コマンドの書式モデル で利用できる。
書式 | 説明 |
FM | 任意の位置に指定し、以後の文字、数値、日時の空白や0を圧縮する。 (Fill Mode:埋め込みモード ≠ Pad 、コアレスモードとでも呼んだ方がわかりやすそう。) |
FX | 任意の位置に指定し、以後の書式を厳密なものとする。 (Formar Exact:厳密な書式)書式に適合しない場合にはエラーとなる。 |
同じ修飾子を複数記述している場合、修飾子の有効化/無効化/有効化/… のトグルとなる。 |
数値書式
すべての数値書式モデルでは、数値が指定された有効桁数以内に格納される。
整数部有効桁数が書式の桁数より多い場合(桁あふれ)、番号記号(#)が値のかわりに戻される。
例) 12345.6789 ⇒ 書式 '9999.99' ⇒ ####.##
小数部は丸められる
例) 1234.56789 ⇒ 書式 '9999.99' ⇒ 1234.57
デフォルトの書式は「数値型の有効桁数(最大 40桁)版」の 'TM9' となる。
書式 | 説明(英語略に関しては一部憶測) |
カンマ(,) | 指定位置にカンマを戻す。 |
G | 指定位置に桁区切り(NLS_NUMERIC_CHARACTER*1)を戻す。(Group separatorの略) |
ドット(.) | 指定位置に小数点文字を戻す。 |
D | 指定位置に小数点文字(NLS_NUMERIC_CHARACTER)を戻す。(1ヵ所のみ可能) (Decimalの略) |
0 | 先頭に符号部(+時はスペース(' ')/-)を付与する(※)。先行ゼロに対して'0'、後続ゼロに対しても'0' を戻す。 |
9 | 先頭に符号部(+時はスペース(' ')/-)を付与する(※)。先行ゼロに対してスペース(' ')、後続ゼロに対して'0'を戻す(※)。 後続する小数部がない場合の値0には '0' を戻す。(例を参考) |
B | 0の場合、全体をスペース(' ')にする(※)。(0フォーマットより優先される) マニュアルでは、整数部が0の場合、固定小数点数の整数部に対して空白を戻す。 (Blankの略)マニュアルの文面と実際の動きは違うように思う。(=完全な0に対してのみのフォーマット) |
C | 指定した位置にNLS_ISO_CURRENCY パラメータの値)を戻す。(JPY) (Currencyの略) |
EEEE | 科学表記(指数表記)で値を戻す。例 9.999EEEE (Exponent:指数の略) |
L | 指定位置にローカル通貨記号(NLS_CURRENCY)を戻す。(円記号'¥')(Local currencyの略) ドル記号('$')だけ特別に書式内に直接書ける。 |
〜MI | 負の値の文末に負の符号(-)を戻す。必ず最後に記述する。 |
〜PR | 負の値の前後を山カッコ<> で囲んだ値を戻す。(Parenthesisの略) |
RN(rn) | 大文字(小文字)のローマ数字で戻す。(1〜3999まで有効)(Roman Numeralsの略) |
S | 符号(+/-)を戻す。先頭または最後にのみ記述可能。(Sign) |
TM9/TME | できるだけ少ない文字数の 10 進数で戻す。(Text Minimum number の略) |
TM9 | 固定表記=デフォルト (64文字までは固定表記、65文字以上は科学表記) |
TME | (e) 科学表記/指数表記 |
V | 値に 10 の n 乗を掛けて戻す。 n は V に続く数字の値でなく「個数」。整数に丸められる。 例) 99V9 (Virtual-decimal-point:仮想小数点の略?) |
X | 16進数値を戻す。(heXadecimalの略) |
(※) FM修飾子の指定によって、さらに変化する。
書式の検証
書式例 (空白をアンダーバー、アンダースコア(_)にて表記)
TO_CHAR( n, 'fmt') , TO_CHAR( n, 'FMfmt')
書式 fmt | 入力 n | 出力書式 修飾子 なし | 出力書式 修飾子 FM 使用 | 補足 |
TO_CHAR( n, '99.99') | 0.5 | '___.50' | '.5' | 符号を表示する部分はサプレスされている。 |
-0.5 | '-__.50' | '-.5' | |
500 | '######' | 変化なし (同左) | 整数部桁あふれ。 |
0.005 | '___.01' | '.01' | 有効数字に丸められる。 |
0 | '___.00' | '0.' | 0のときのFMあり/なしで、かなり異なる結果になる。 |
TO_CHAR( n, '9') | 0 | '_0' | '0' | 書式修飾子がなく、小数部の書式指定もない場合、結果は '__'ではなく'_0' となる。 上のTO_CHAR( 0, '99.99') と比較参照 |
TO_CHAR( n, '00.00') | 0.5 | '_00.50' | '00.50' | |
-0.5 | '-00.50' | 変化なし (同左) | |
500 | '######' | 変化なし (同左) | |
0.005 | '_00.01' | '00.01' | |
0 | '_00.00' | '00.00' | |
TO_CHAR( n, '0') | 0 | '_0' | '0' | |
TO_CHAR( n, 'B0.00') | 0 | '_____' | NULL('') | |
0.05 | '_0.05' | '0.05' | マニュアルによると、'__.05' / '.05' になるはずなのだが 読み違えているのか? |
関連事項