$NUMBER
Synopsis
$NUMBER(num,format,min,max) $NUM(num,format,min,max)
パラメータ
num | 検証され、Caché キャノニック形式に変換される数値。数値、文字列値、変数名、あるいは有効な任意の ObjectScript 式にできます。 |
format | オプション — num に適用する処理オプションを指定します。これらの処理法は、主に小数点を含む数字を認識し、処理する方法を指示します。 |
min | オプション — 許容範囲内の最小値。 |
max | オプション — 許容範囲内の最大値。 |
概要
$NUMBER 関数は、指定した format を使用して、num 数値の変換と検証を実行します。さまざまな句読点形式の数字を受け取り、Caché キャノニック形式の数字を返します。format を使用して数が整数かどうかを確認できます。min または max が指定された場合、数字をその範囲の値に収める必要があります。
$NUMBER は、アメリカ形式の数、ヨーロッパ形式の数、ロシア/チェコ形式の数に使用できます。
$DOUBLE の INF値、–INF値、または NAN 値で $NUMBER を使用すると、常に空の文字列を返します。
パラメータ
format
利用可能な format コードは、以下のとおりです。これらの format コードは、どのような順序でも指定できます。数値以外の format は、引用符付きの文字列として指定されなければなりません。以下の format コードはいずれも省略可能です。format が無効の場合、$NUMBER は <SYNTAX> エラーを生成します。
-
10 進文字は、"." または "," のいずれかを使用しますが、"." はアメリカ式、"," はヨーロッパ式の小数点検証用の変換方式を示します。これらのうちいずれかの文字を指定するか、あるいは 10 進文字を使用しません。10 進文字を省略する場合、その数は現在のロケールの DecimalSeparator を取得します。
-
丸め係数は、小数点何桁まで丸めを行うかを示す整数です。整数の前には、+ 符号または - 符号を付けます。丸め係数が正数 (あるいは符号無し) の場合、number は指定された小数桁で丸めます。丸め係数が 0 の場合、number は整数に丸めます。丸め係数が負の整数の場合、number は小数点区切り文字の左にある数字に対し指定された桁数で丸めます。例えば、丸め係数が -2 の場合、234.45 は 200 に丸められます。数字の "5" は常に繰り上がります。したがって、丸め係数が 1 の場合、123.45 は 123.5 になります。
-
整数表示文字 : 文字 "I" (大文字または小文字) は、number が整数値に解決される必要があることを指定します。例えば、–07.00 は整数に解決されますが、–07.01 は整数に解決されません。数が整数に解決されない場合、$NUMBER は NULL 文字列を返します。以下の例では、最初の 3 つの $NUMBER 関数のみが整数を返します。それ以外の 3 つの関数は、NULL 文字列を返します。
WRITE $NUMBER(-07.00,"I")," non-canonical integer numeric",! WRITE $NUMBER(+"-07.00","I")," string forced as integer numeric",! WRITE $NUMBER("-7","I")," canonical integer string numeric",! WRITE $NUMBER("-07.00","I")," non-canonical integer string numeric",! WRITE $NUMBER(-07.01,"I")," fractional numeric",! WRITE $NUMBER("-07.01","I")," fractional string numeric",!
Min と Max
許容最小値や許容最大値、またはその両方を指定できます。あるいは、一切指定なしでもかまいません。指定する場合、num 値 (丸め実行後) は、min 値以上、max 値以下でなければなりません。min または max 値として NULL 文字列を指定した場合、これは 0 に相当します。値がこの基準に合わない場合、$NUMBER は NULL 文字列を返します。
したがって、以下の例で 1 つ目は、num (4.0) が max (4) と同等なので、有効です。2 つ目の例も、num (4.003) が max (4) と形式範囲内 (小数点以下 2 桁) で同等なので、有効です。しかし 3 つ目の例は、$NUMBER が num を形式範囲内で maxより大きい値である (4.01) まで丸めを行ってしまうため、有効ではありません。その結果、NULL 文字列を返します。
WRITE !,$NUMBER(4.0,2,0,4)
WRITE !,$NUMBER(4.003,2,0,4)
WRITE !,$NUMBER(4.006,2,0,4)
コンマをプレース・ホルダとして保持し、パラメータの削除を行うことができます。以下の例で、1 行目は max 値を設定しますが、format または min の値は設定されません。2 行目では、format 値を設定しませんが、ゼロと等しい NULL 文字列の min 値を設定します。したがって、1 行目は -7 を返し、2 行目は min の基準を満たさないので、NULL 文字列を返します。
SET max=10
WRITE !,$NUMBER(-7,,,max)
WRITE !,$NUMBER(-7,,"",max)
末尾のコンマは指定できません。以下の結果は <SYNTAX> エラーになります。
WRITE $NUMBER(mynum,,min,)
メモ
演算の順序
$NUMBER は以下の一連の変換と検証を実行します。数字の妥当性検証に失敗した場合、$NUMBER は NULL 文字列 ("") を返します。すべての検証に合格した場合、Caché 標準の数字に変換した結果を返します。
-
$NUMBER は、10 進文字形式を使用して、どの文字がグループ区切り文字であるかを判別し、(数におけるそれらの位置に関係なく) すべてのグループ区切り文字を削除します。使用する規則は以下のとおりです。format で指定した小数点文字がピリオド (.) の場合、グループ区切り文字はコンマ (,) または空白スペースです。format で指定した小数点文字がコンマ (,) の場合、グループ区切り文字はピリオド (.) または空白スペースですformat に 10 進文字が指定されていない場合、グループ・セパレータは、現在のロケールの NumericGroupSeparator プロパティの値となります。(ロシア語 (rusw)、ウクライナ語 (ukrw)、チェコ語 (csyw) のロケールでは、数値グループ区切り文字として空白スペースが使用されます)。
-
$NUMBER は、数字が規則に合っているかどうか妥当性の検証を行います。適格な number は以下のいずれかを含みます。
-
数値。
-
上述の任意の小数点文字 (1 つまたは指定なしで、複数指定は不可)。
-
任意のプラス (+) あるいはマイナス (-) 符号 (先頭あるいは末尾に置き、複数指定は不可)。
-
負の値 (借方) を示す数を囲む任意の括弧。括弧内の数字には符号を付けません。
-
整数の後に続く "E" (大文字もしくは小文字) によって示される、任意の 10 進数の指数。"E" を指定する場合は、指数が存在する必要があります。指数の前に符号が付く場合もあります。
-
-
整数表示文字が format 内に存在する場合、$NUMBER は整数をチェックします。整数には小数点文字を記述できません。数値文字列 ("123.45") と数 (123.45) は、個別に解析されます。数値文字列は、小数点文字の後に数字の桁がない場合や、拡張科学的記数法や数の丸めにより小数桁が削除されている場合でも、整数テストには失敗します。数は、これらの検証テストに成功します。数が整数表示テストに失敗した場合、$NUMBER は NULL 文字列 ("") を返します。
-
$NUMBER は number を Caché 標準数値に変換します。科学的記数法を展開し、括弧を負の符号文字と置き換え、先頭あるいは末尾にあるゼロを取り除き、後にゼロでない数字桁が続かない小数点文字を削除します。
-
$NUMBER は (存在する場合は) 丸め係数を使用して、指定された桁に数字を丸めます。その後、後に数字が何も続かない場合は、先頭あるいは末尾にあるゼロと小数点文字を削除します。
-
$NUMBER は、最小値が指定されている場合、その値に対し数字の妥当性を検証します。
-
$NUMBER は、最大値が指定されている場合、その値に対し数字の妥当性を検証します。
-
$NUMBER は結果の数字を返します。
ヨーロッパ式およびアメリカ式の小数点区切り文字
$NUMBER は、キャノニック形式の数値を返し、数字グループ・セパレータをすべて削除して小数点区切り文字を 1 つ追加します。format の値 “,” または “.” を使用して、num で使用する小数点区切り文字を識別することができます。また、小数点区切り文字を指定することで、数字グループ・セパレータを暗黙的に指定することもできます。
ユーザのロケールの DecimalSeparator 文字を決定するには、以下のメソッドを呼び出します。
WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
ユーザのロケールの NumericGroupSeparator 文字と NumericGroupSize 数を決定するには、以下のメソッドを呼び出します。
WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSeparator"),!
WRITE ##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSize")
以下の例では、コンマを小数点区切り文字に指定します。
SET num="123,456"
WRITE !,$NUMBER(num,",")
// converts to the fractional number "123.456"
// (comma is identified as decimal separator)
SET num="123,45,6"
WRITE !,$NUMBER(num,",")
// returns the null string
// (invalid number, too many decimal separators)
SET num="123.456"
WRITE !,$NUMBER(num,",")
// converts to the integer "123456"
// removing group separator
// (if comma is decimal, then period is group separator)
SET num="123.4.56"
WRITE !,$NUMBER(num,",")
// converts to the integer "123456"
// removing group separators
// (number and placement of group separators ignored)
丸めと精度
数値を丸める際、IEEE 浮動小数点数と標準の Caché 小数の精度が異なることに注意してください。$DOUBLE IEEE 浮動小数点数は、バイナリ表現でエンコードされます。これらの精度は 53 バイナリ・ビットで、これは 15.95 小数桁数の精度に相当します(バイナリ表現は正確に小数と一致するものではありません)。ほとんどの小数はこのバイナリ表現では正確に表すことができないため、IEEE 浮動小数点数は対応する標準の Caché 浮動小数点数とは若干異なる場合があります。サポートされるすべての Caché システム・プラットフォームにおいて、標準の Caché 小数は、小数桁数 18 桁の精度を持ちます。IEEE 浮動小数点数が小数として表示されるとき、バイナリ・ビットが18 桁を大幅に超える小数桁数の小数に変換されることがよくあります。これは、IEEE 浮動小数点数が標準の Caché 小数より精度が高いことを意味するわけではありません。
関連項目
-
$DOUBLE 関数
-
$FNUMBER 関数
-
$INUMBER 関数
-
$ISVALIDNUM 関数
-
$NORMALIZE 関数
-
ロケールの詳細は、"Caché 専用のシステム/ツールおよびユーティリティ" の “各国言語サポートのシステム・クラス” のセクションを参照してください。