$ISVALIDNUM (ObjectScript)
構文
$ISVALIDNUM(num,scale,min,max)
引数
引数 | 説明 |
---|---|
num | 検証される数値。数値、文字列値、変数名、あるいは有効な ObjectScript 式にできます。 |
scale | オプション — min と max の範囲を比較する場合に有効な小数点以下の桁数。 |
min | オプション — 許容範囲内の最小値。 |
max | オプション — 許容範囲内の最大値。 |
概要
$ISVALIDNUM 関数は num を検証し、ブーリアン値を返します。オプションで、min 値と max 値を使用して範囲チェックも行います。scale 引数は、範囲チェック時に比較する小数桁数を指定するために使用されます。ブーリアン値 1 は、num が適切に構成された数であることを意味し、指定された場合は範囲チェックに合格したことを意味します。
$ISVALIDNUM は、アメリカ形式の数 (ピリオド (.) を小数点区切り文字として使用する) を評価します。これは、ヨーロッパ形式の数 (コンマ (,) を小数点区切り文字として使用する) は評価しません。$ISVALIDNUM は、数値グループ区切り文字を含む数を有効と見なしません。現在のロケールに関係なく、コンマまたは空白スペースを含む数に対して 0 (無効) を返します。
引数
num
検証される数は整数、実数、または科学的記数法の数 (文字 “E” または “e” 付き) のいずれかです。文字列、式、または数に解決される変数のいずれかになることもあります。符号付きや符号なし、先頭、または末尾に 0 が付いていることもあります。検証は、以下の場合に失敗 ($ISVALIDNUM が 0 を返す) します。
-
num が空の文字列 ("") の場合。
-
num が 0-9、先頭の +、– 符号、小数点(.)、および “E” または “e” 以外の任意の文字を含む場合。科学的記数法では、大文字の “E” は標準の指数演算子です。小文字の “e” は、%SYSTEM.Process.ScientificNotation()Opens in a new tab メソッドを使用して構成できる指数演算子です。
-
num が複数の + または – 符号、小数点、文字 "E" または "e" を含む場合。
-
オプションの + または – 符号は、num の最初の文字ではありません。
-
10 進法の指数を表す文字 “E”、もしくは “e” の後に数値文字列の整数が続かない場合。
scale 引数値により、num 値の端数を丸めた値、または切り捨てた値を使用して評価が行われます。num 変数の実際の値は、$ISVALIDNUM 処理によって変更されません。
num が $DOUBLE、$ISVALIDNUM によって返された INF、–INF、または NAN の値の場合、1 を返します。
InterSystems IRIS® データ・プラットフォームがサポートする浮動小数点数の最大値は 1.7976931348623157081E308 です。任意の InterSystems IRIS の数値演算でこれよりも大きい数を指定すると、<MAXNUMBER> エラーが発生します。$ISVALIDNUM がサポートする、文字列として指定される InterSystems IRIS の 10 進数の浮動小数点数の最大値は 9.223372036854775807E145 です。これよりも大きい浮動小数点数文字列の場合は、$ISVALIDDOUBLE を使用します。詳細は、"極端に大きな数字" を参照してください。
scale
scale 引数は、範囲チェック時に比較する小数桁数を指定するために使用されます。scale には整数値を指定します。scale 値の小数桁数は無視されます。他の引数で指定された小数桁数よりも大きい scale 値を指定することができます。-1 の scale 値を指定することもできます。それ以外の負の scale 値はすべて、<FUNCTION> エラーが返されます。
非負数の scale 値を指定すると、min と max の範囲チェック実行前に、num がその小数桁数に丸められます。scale値に 0 を指定すると、範囲チェック実行前に num は整数値 (3.9 = 4) に丸められます。scale 値に -1 を使用すると、範囲チェック実行前に num は整数値 (3.9 = 3) に切り捨てられます。指定されたすべての桁を丸めたり、切り捨てることなく比較するには、scale 引数を省略します。数値以外の scale 値や NULL 文字列は、scale 値 0 に相当します。
丸めは、–1 を除くすべての scale 値に対して実行されます。5 以上の値は常に切り上げられます。
scale 引数を省略する場合、コンマはプレースホルダとして保持しておきます。
数値を丸める際、IEEE 浮動小数点数と標準の InterSystems IRIS 小数の精度が異なることに注意してください。$DOUBLE IEEE 浮動小数点数は、バイナリ表現でエンコードされます。これらの精度は 53 バイナリ・ビットで、これは 15.95 小数桁数の精度に相当します (バイナリ表現は正確に小数と一致するものではありません)。ほとんどの小数はこのバイナリ表現では正確に表すことができないため、IEEE 浮動小数点数は対応する InterSystems IRIS 標準の浮動小数点数とは若干異なる場合があります。サポートされるすべての InterSystems IRIS システム・プラットフォームにおいて、標準の InterSystems IRIS 小数は、小数桁数 18 桁の精度を持ちます。IEEE 浮動小数点数が小数として表示されるとき、バイナリ・ビットが 18 桁を大幅に超える小数桁数の小数に変換されることがよくあります。これは、IEEE 浮動小数点数が InterSystems IRIS 標準の小数より精度が高いことを意味するわけではありません。
min と max
許容最小値や許容最大値、またはその両方を指定できます。あるいは、一切指定なしでもかまいません。指定された場合、(scale 演算後の) num の値は min の値以上で、max の値以下でなければなりません。min または max 値として NULL 文字列を指定した場合、これは 0 に相当します。値がこの条件に合わない場合、$ISVALIDNUM は 0 を返します。
引数を省略する場合、コンマはプレースホルダとして保持しておきます。例えば、scale を省略して min か max を指定するとき、または min を省略して max を指定するときなどです。末尾のコンマは無視されます。
num、min、または max 値が $DOUBLE 数の場合、この範囲チェックではこれら 3 つの数はすべて $DOUBLE 数として処理されます。これによって、生成された $DOUBLE 数の小数部の小部分によって予期しない範囲エラーが引き起こされるのを防ぐことができます。
例
以下の例では、$ISVALIDNUM の各呼び出しはすべて 1 (有効な値) を返します。
WRITE !,$ISVALIDNUM(0) ; All integers OK
WRITE !,$ISVALIDNUM(4.567) ; Real numbers OK
WRITE !,$ISVALIDNUM("4.567") ; Numeric strings OK
WRITE !,$ISVALIDNUM(-.0) ; Signed numbers OK
WRITE !,$ISVALIDNUM(+004.500) ; Leading/trailing zeroes OK
WRITE !,$ISVALIDNUM(4E2) ; Scientific notation OK
以下の例では、$ISVALIDNUM の各呼び出しはすべて 0 (無効な値) を返します。
WRITE !,$ISVALIDNUM("") ; Null string is invalid
WRITE !,$ISVALIDNUM("4,567") ; Commas are not permitted
WRITE !,$ISVALIDNUM("4A") ; Invalid character
以下の例では、INF (無限大) および NAN (非数値) が厳密には数字でなくても、$ISVALIDNUM の各呼び出しはすべて 1 (有効な値) を返します。
DO ##class(%SYSTEM.Process).IEEEError(0)
WRITE !,$ISVALIDNUM($DOUBLE($ZPI)) ; DOUBLE numbers OK
WRITE !,$ISVALIDNUM($DOUBLE("INF")) ; DOUBLE INF OK
WRITE !,$ISVALIDNUM($DOUBLE("NAN")) ; DOUBLE NAN OK
WRITE !,$ISVALIDNUM($DOUBLE(1)/0) ; generated INF OK
以下の例は、min 引数や max 引数の使用法を示しています。以下はすべて、1 (数は有効で、範囲チェックにも合格する) を返します。
WRITE !,$ISVALIDNUM(4,,3,5) ; scale can be omitted
WRITE !,$ISVALIDNUM(4,2,3,5) ; scale can be larger than
; number of fractional digits
WRITE !,$ISVALIDNUM(4,0,,5) ; min or max can be omitted
WRITE !,$ISVALIDNUM(4,0,4,4) ; min and max are inclusive
WRITE !,$ISVALIDNUM(-4,0,-5,5) ; negative numbers
WRITE !,$ISVALIDNUM(4.00,2,04,05) ; leading/trailing zeros
WRITE !,$ISVALIDNUM(.4E3,0,3E2,400) ; base-10 exponents expanded
以下の例は、min 引数と max 引数と一緒に scale 引数を使用する方法を示しています。以下はすべて、1 (数は有効で、範囲チェックにも合格する) を返します。
WRITE !,$ISVALIDNUM(4.55,,4.54,4.551)
; When scale is omitted, all digits of num are checked.
WRITE !,$ISVALIDNUM(4.1,0,4,4.01)
; When scale=0, num is rounded to an integer value
; (0 fractional digits) before min & max check.
WRITE !,$ISVALIDNUM(3.85,1,3.9,5)
; num is rounded to 1 fractional digit,
; (with values of 5 or greater rounded up)
; before min check.
WRITE !,$ISVALIDNUM(4.01,17,3,5)
; scale can be larger than number of fractional digits.
WRITE !,$ISVALIDNUM(3.9,-1,2,3)
; When scale=-1, num is truncated to an integer value
$ISVALIDNUM と $ISVALIDDOUBLE の比較
$ISVALIDNUM 関数と $ISVALIDDOUBLE 関数は両方とも数を検証し、ブーリアン値 (0 または 1) を返します。
-
どちらの関数も、有効な数字として、$DOUBLE によって返された INF、–INF、NAN の値を受け入れます。また、$ISVALIDDOUBLE は、有効な数字として、大文字小文字を区別しない文字列 “NAN”、“INF”、および “Infinity”、“sNAN”、プラス記号またはマイナス記号が先頭に付いた任意のこれらの文字列を受け入れます。$ISVALIDNUM は、これらの文字列すべてを無効として拒否し、0 を返します。
WRITE !,$ISVALIDNUM($DOUBLE("NAN")) ; returns 1 WRITE !,$ISVALIDDOUBLE($DOUBLE("NAN")) ; returns 1 WRITE !,$ISVALIDNUM("NAN") ; returns 0 WRITE !,$ISVALIDDOUBLE("NAN") ; returns 1
-
これら 2 つの関数は、符号付き、または符号なしの整数 (- 0 を含む)、科学的記数法の数 (“E” または “e” 付き)、実数 (123.45)、および数値文字列 (“123.45”) を解析します。
-
どちらの関数も、ヨーロッパ形式の DecimalSeparator 文字 (コンマ (,)) および NumericGroupSeparator 文字 (アメリカ形式はコンマ (,)、ヨーロッパ形式はピリオド (.)) は認識しません。例えば、現在のロケール設定に関わらず、どちらも文字列 “123,456” を無効な数値として拒否します。
-
2 つの関数は、数字に対して先頭の複数の符号 (+ と –) を解析します。どちらも引用符付き数値文字列に入った先頭の複数の符号を受け入れません。
数値文字列が大きすぎて InterSystems IRIS 浮動小数点数によって表せない場合、既定では IEEE 倍精度数に自動的に変換されます。ただし、以下の例のように、そのような大きな数字は $ISVALIDNUM テストに失敗します。
WRITE !,"E127 no IEEE conversion required"
WRITE !,$ISVALIDNUM("9223372036854775807E127")
WRITE !,$ISVALIDDOUBLE("9223372036854775807E127")
WRITE !,"E128 automatic IEEE conversion"
WRITE !,$ISVALIDNUM("9223372036854775807E128")
WRITE !,$ISVALIDDOUBLE("9223372036854775807E128")
$ISVALIDNUM、$NORMALIZE、および $NUMBER の比較
$ISVALIDNUM、$NORMALIZE、および$NUMBER 関数はすべて、数値を検証します。$ISVALIDNUM は、ブーリアン値 (0 または 1) を返します。$NORMALIZE と $NUMBER は、指定された数を検証して返します。
これら 3 つの関数では、検証の条件は異なります。必要に応じて、それぞれの関数を使い分けてください。
-
アメリカ形式の数は、3 つすべての関数で検証されます。ヨーロッパ形式の数は、$NUMBER 関数のみで検証されます。
-
これら 3 つの関数は、符号付き、または符号なしの整数 (- 0 を含む)、科学的記数法の数 (“E” または “e” 付き)、および小数部分を持つ数を解析します。ただし、$NUMBER は小数部分を持つ数 (負の 10 進数の指数を持つ科学的記数法を含む) を拒否するように (“I” 形式を使用して) 設定できます。3 つの関数はすべて、数 (123.45) と数値文字列 ("123.45") の両方を解析します。
-
この 3 つの関数では、先頭と末尾の 0 は削除されます。10 進文字は、ゼロでない値が続かない限り削除されます。
-
DecimalSeparator: $NUMBER は、format 引数 (または現在のロケールに対する既定値) に基づいて、小数点文字 (アメリカ形式はピリオド (.)、ヨーロッパ形式はコンマ (,)) を検証します。現在のロケール設定に関わらず、その他の関数は、アメリカ形式の 小数のみを検証します。
-
NumericGroupSeparator: $NUMBER は、NumericGroupSeparator 文字 (アメリカ形式はコンマ (,) または空白スペース、ヨーロッパ形式はピリオド (.) または空白スペース) を許可します。また、位置に関わらず、任意の数の NumericGroupSeparator 文字を許可し、削除します。例えばアメリカ形式は、数 123456.99 として “12 3,,4,56.9,9” を検証します。$NORMALIZE は、NumericGroupSeparator 文字を認識しません。この関数は、数値以外の文字を検出するまで、文字ごとに検証します。例えば “123,456.99” を、数 123 として検証します。$ISVALIDNUM は、文字列 “123,456” を無効な数値として拒否します。
-
先頭の複数の符号 (+ と –) は、数に対する 3 つすべての関数によって解釈されます。ただし、$NORMALIZE だけは、引用符付き数値文字列で先頭の複数の符号を受け入れます。
-
末尾の + と – 符号。3 つの関数ではすべて、数の末尾の符号を受け入れません。しかし、引用符付き数値文字列では、$NUMBER は末尾の符号を 1 つ (唯一) 解析し、$NORMALIZE は複数の末尾の符号を解析し、$ISVALIDNUM は末尾に符号を含む文字列をすべて無効な数として受け入れません。
-
括弧。$NUMBER は、引用符付き文字列内の符号なしの数を囲む括弧を、負の数を示すものとして解析します。$NORMALIZE と $ISVALIDNUM は、括弧を受け入れません。
-
複数の 10 進文字を含む、数値文字列。$NORMALIZE は 2 番目の 10 進文字を検出するまで、文字ごとに検証を行います。例えばアメリカ形式は、"123.4.56" を数 123.4 として検証します。$NUMBER と $ISVALIDNUM は、1 つ以上の 10 進文字を含む任意の文字列を無効な数として受け入れません。
他の数値以外の文字を含む数値文字列:$NORMALIZE は、アルファベット文字を検出するまで、文字ごとに検証を行います。これは、"123A456" を数 123 として検証します。$NUMBER と $ISVALIDNUM は文字列全体を検証し、"123A456" を無効な数として受け入れません。
-
NULL 文字列。$NORMALIZE は、NULL 文字列をゼロ (0) として解析します。$NUMBER と $ISVALIDNUM は、NULL 文字列を受け入れません。
$ISVALIDNUM 関数と $NUMBER 関数は、オプションで min/max の範囲チェックを行います。
$ISVALIDNUM、$NORMALIZE、および $NUMBER はすべて、指定された小数桁数に数を丸めます。$ISVALIDNUM と $NORMALIZE は、小数桁数の丸め、および小数部を持つ数の丸めまたは切り捨てを行って、整数を返します。例えば、$NORMALIZE は 488.65 を 488.7 または 489 に丸めるかまたは、488 に切り捨てることができます。$NUMBER は、小数桁および整数桁の両方を丸めることができます。例えば、$NUMBER は 488.65 を 488.7、489、490、または 500 に丸めることができます。
関連項目
-
$DOUBLE 関数
-
$FNUMBER 関数
-
$INUMBER 関数
-
$NORMALIZE 関数
-
$NUMBER 関数