Oracle Databaseでは、さまざまな方法で数値をフォーマットできます。
たとえば、数値を通貨としてフォーマットし、適切な場所にコンマと小数点を配置できます。先行ゼロを指定したり、小数部分を追加したり、必要に応じて削除したりできます。
この記事には、次の例が含まれています。
- 数値を通貨としてフォーマットする
- カンマ/千単位の区切り文字を追加します
- 小数点以下の桁数を含める
- 小数点以下をすべて削除
- 先行ゼロを数値に追加する
また、フォーマットがセッションのNLSパラメータによってどのように影響を受けるかについても説明します。
NLS初期化パラメーターは、現在のセッションでグループ区切り文字、小数点文字、および通貨記号に使用される文字を決定します。これらのパラメータを利用して、ロケール対応のフォーマットを出力できます。
TO_CHAR(number)
などの関数を使用できます さらにLPAD()
数値を文字列に変換し、その場で好きなように正確にフォーマットします。 CAST()
のような関数 キャストされるデータ型によっては、数値のフォーマット方法にも影響を与える可能性があります。
簡単な例
TO_CHAR()
を使用して数値をフォーマットする簡単な例を次に示します。 機能:
SELECT
TO_CHAR(12345, 'fmL99G999D00')
FROM DUAL;
結果:
$12,345.00
fmL99G999D00
partは、出力のフォーマット方法を決定するフォーマットモデルです。要件に合わせてフォーマットモデルを変更できます。
フォーマットモデルの各文字はフォーマット要素であり、特別な意味があります。必要に応じて、フォーマット要素を追加または削除できます。
数値をフォーマットするときにフォーマットモデルに使用できるフォーマット要素の完全なリストは次のとおりです。
確かに、さまざまな形式要素に文字列リテラルを指定できます(たとえば、ドル記号($
) )ドルの場合)、これは、通貨がそのハードコードされた値で表示されることを前提としています。世界中には他にも多くの可能な通貨があり、フォーマット要素はユーザーのセッションの現地通貨記号を動的に返すことができます。
グループ区切り文字と10進文字についても同じです。ロケールが異なれば、使用される規則も異なります。これらのロケール対応のフォーマット要素を使用すると、コードの移植性が高まります。
また、TO_CHAR()
関数を使用すると、関数内で独自のNLSパラメーターを渡すことができます。これを行うと、その関数呼び出しにのみ影響するため、通貨記号などをその場でフォーマットモデルにハードコーディングしたり、セッションのNLSパラメータを更新したりすることなく変更できます。
次の例は、各フォーマット要素がどのように機能するかをより詳細に示しています。
数値を通貨としてフォーマットする
数値を通貨としてフォーマットする例を次に示します。
SELECT
TO_CHAR(12, 'fmL99')
FROM DUAL;
結果:
$12
この場合、私はL
を使用しました 現地通貨記号を指定するformat要素。現地通貨記号は、NLS_CURRENCY
によって決定されます。 パラメータ。
または、C
を使用することもできます またはU
フォーマット要素。ISO通貨記号と二重通貨記号をそれぞれ返します。
詳細と例については、Oracleで数値を通貨としてフォーマットする方法を参照してください。
カンマ/千単位の区切り文字を追加
千/グループの区切り文字には常にハードコードされたカンマを使用できますが、グループの区切り文字にピリオドを使用している国は考慮されていません。その逆は明らかに真実です。また、一部の国では、数千のグループが薄いスペースで区切られています。
G
を使用できます グループ区切り文字を指定するformat要素。これにより、NLS_NUMERIC_CHARACTERS
で指定されている該当するグループセパレータが動的に返されます。 パラメータ。このパラメーターは、グループ区切り文字と10進文字の両方を決定します。
例:
SELECT
TO_CHAR(12345, 'fm99G999')
FROM DUAL;
結果:
12,345
数が多い別の例を次に示します。
SELECT
TO_CHAR(123456789, 'fm999G999G999')
FROM DUAL;
結果:
123,456,789
詳細については、Oracleでコンマを使用して数値をフォーマットする方法を参照してください。
小数点以下の桁数を含める
独自の基数文字(ピリオドなど)をフォーマットモデルにハードコーディングできることは事実ですが、これは、別の文字を使用する他のロケールには対応していません。
D
を使用できます NLS_NUMERIC_CHARACTERS
で指定された10進数/基数文字を返すformat要素 現在のセッションのパラメータ:
SELECT
TO_CHAR(7, 'fm9D00')
FROM DUAL;
結果:
7.00
この場合、2つの0
を使用しました 基数文字の後に要素をフォーマットします。このformat要素は、該当する場合、末尾のゼロを返します。
9
を使用する この場合、後続のゼロはすべて抑制されます:
SELECT
TO_CHAR(7, 'fm9D99')
FROM DUAL;
結果:
7.
ただし、fm
を削除すると フォーマット修飾子を使用すると、異なる結果が得られます:
SELECT
TO_CHAR(7, '9D99')
FROM DUAL;
結果:
7.00
fm
format修飾子は、結果に適用されるすべてのパディングを抑制します。それを削除することで、結果が埋め込まれます。これには先頭のスペースが含まれています。これは、数値が負の場合に負の符号が表示される場所であるためです。また、2つの9
を指定したため、末尾のゼロも含まれています フォーマット要素。
数値を小数点以下2桁にフォーマットする方法の詳細については、Oracleで数値を小数点以下2桁にフォーマットする3つの方法を参照してください。
小数点以下の桁数をすべて削除
小数点以下の桁数がないように数値をフォーマットする方法はいくつかあります。明らかな方法の1つは、フォーマット文字列から小数部分を削除することです。
SELECT
TO_CHAR(7, 'fm9')
FROM DUAL;
結果:
7
ただし、ROUND()
などの他の関数を使用することもできます。 、TRUNC()
、およびCAST()
同じまたは同様の効果を達成するため。
例については、Oracleで小数点なしの数値をフォーマットする4つの方法を参照してください。
先行ゼロを追加
数値に先行ゼロを追加する場合、いくつかのオプションがあります。
繰り返しますが、TO_CHAR()
に固執します 関数の場合、0
を使用できます 先頭と末尾のゼロを返すように要素をフォーマットします。
SELECT
TO_CHAR(7, 'fm000')
FROM DUAL;
結果:
007
9
を使用した場合 format要素の場合、先行ゼロはありません:
SELECT
TO_CHAR(7, 'fm999')
FROM DUAL;
結果:
7
ただし、fm
を削除すると フォーマット修飾子を使用すると、先行ゼロが含まれるスペースができます。
SELECT
TO_CHAR(7, '999')
FROM DUAL;
結果:
7
先行ゼロを使用して数値をフォーマットする別の方法は、LPAD()
を使用することです。 働き。この関数は、文字列または数値に左パディングを適用します。パディングに使用する文字を指定できるため、ゼロを使用すると、ゼロがパディングされます。
例については、Oracleで先行ゼロを使用して数値をフォーマットする2つの方法を参照してください。
NLSパラメータを確認する方法
NLS(National Language Support)パラメーターは、クライアントとサーバーの両方でのロケール固有の動作を決定します。これには、グループ区切り文字、小数点文字、通貨記号などに使用する文字を決定するパラメーターが含まれます。
NLSパラメータの現在の値を確認しましょう:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS;
結果:
PARAMETER VALUE __________________________ _________________________________ NLS_LANGUAGE ENGLISH NLS_TERRITORY AUSTRALIA NLS_CURRENCY $ NLS_ISO_CURRENCY AUSTRALIA NLS_NUMERIC_CHARACTERS ., NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD/MON/RR NLS_DATE_LANGUAGE ENGLISH NLS_CHARACTERSET AL32UTF8 NLS_SORT BINARY NLS_TIME_FORMAT HH12:MI:SSXFF AM NLS_TIMESTAMP_FORMAT DD/MON/RR HH12:MI:SSXFF AM NLS_TIME_TZ_FORMAT HH12:MI:SSXFF AM TZR NLS_TIMESTAMP_TZ_FORMAT DD/MON/RR HH12:MI:SSXFF AM TZR NLS_DUAL_CURRENCY $ NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE
次のパラメータは、数値と通貨のフォーマット要素を決定します。
-
NLS_CURRENCY
-
NLS_ISO_CURRENCY
-
NLS_NUMERIC_CHARACTERS
-
NLS_DUAL_CURRENCY
これらのパラメータのデフォルト値は、NLS_TERRITORY
によって決定されます。 パラメータ。 NLS_TERRITORY
の値を設定するとき パラメータの場合、これは他のさまざまなパラメータ(前述の4つを含む)の値を暗黙的に設定します。
私の場合、私の領土はオーストラリアです。したがって、これらの4つのパラメーターは、オーストラリアでの数値の通常のフォーマット方法を反映しています。たとえばドイツに変更すると、これらの4つのパラメーターは、ドイツのフォーマットを反映するように更新されます。
ただし、各パラメータを個別に明示的に設定できます。これにより、NLS_TERRITORY
によって暗黙的に設定された値をオーバーライドできます。 パラメータ。