Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

$NORMALIZE

数値を検証して返し、指定された小数桁数に丸めます。

Synopsis

$NORMALIZE(num,scale)

パラメータ

num 検証される数値。数値、文字列値、変数名、あるいは有効な ObjectScript 式にできます。
scale 返り値としてnum が丸められる有効な小数桁数。この数は、num の実際の小数桁数より大きい場合も、小さい場合もあります。許可される値は、0 (整数に丸める)、-1 (整数に切り捨てる)、および正の整数 (指定した小数桁数に丸める) です。最大 scale 値はありません。ただし、機能上の最大値が数値精度を超えることはありません。標準 Caché 小数では、機能上の scale の最大値は 18 (から整数桁数 –1 を引く) です。

概要

$NORMALIZE 関数は num を検証し、num を正規化した形式を返します。また、scale パラメータを使用して、小数桁数の丸め (または切り捨て) を行います。scale パラメータを使用して実数を指定した小数桁数に丸めたり、実数を整数に丸めたり、実数を整数に切り捨てたりすることができます。

丸めの後、$NORMALIZE は、返り値から末尾のゼロを削除します。このため、返される小数桁数は、以下の例に示すように scale で指定された数より小さくなる場合があります。

  WRITE $NORMALIZE($ZPI,11),!
  WRITE $NORMALIZE($ZPI,12),!   /* trailing zero removed */
  WRITE $NORMALIZE($ZPI,13),!
  WRITE $NORMALIZE($ZPI,14)

パラメータ

num

検証される数は整数、実数、または科学的記数法の数 (文字 “E” または “e” 付き) のいずれかです。文字列、式、または数に解決される変数のいずれかになることもあります。符号付きや符号なし、先頭、または末尾に 0 が付いていることもあります。$NORMALIZE は、文字ごとに検証を行います。以下の場合は、検証を中止し、文字列の検証された部分を返します。

  • num が 0-9、+ または – 符号、小数点(.)、および “E” または “e” 以外の任意の文字を含む場合。

  • num が複数の小数点、文字 "E" または "e" を含む場合。

  • num で + 符号または – 符号が数値の後にある場合、これらは末尾の符号と見なされ、それ以降の数値は解析されません。

  • "E"、もしくは "e" の後に数値の整数が続いていない場合。

scale パラメータ値を使用すると、返り値は、num 値を丸めた、または切り捨てた値となります。num 変数の実際の値は、$NORMALIZE 処理によって変更されません。

scale

必須の scale パラメータは、丸める小数桁数を指定するために使用されます。指定された値に応じて、scale は、小数桁数に影響を与えない、指定された小数桁数に丸める、整数に丸める、または整数に切り捨てる場合があります。

負数ではない scale 値を使用して、num を指定された小数桁数に丸めることができます。丸めるとき、値 5、またはそれ以上の値は切り上げられます。数の丸めを避けるには、scalenum で可能な小数桁数よりも大きい値に設定します。scale 値に 0 を指定すると、num は整数値 (3.9 = 4) に丸められます。scale 値に -1 を指定すると、num は整数値 (3.9 = 3) に切り捨てられます。数値以外の scale 値や NULL 文字列は、scale 値 0 に相当します。

scale には整数値を指定します。scale 値の小数桁数は無視されます。num で指定された小数桁数よりも大きい scale 値を指定することができます。-1 の scale 値を指定することもできます。それ以外の負の scale 値はすべて、<FUNCTION> エラーが返されます。

以下の例では、$NORMALIZE の各呼び出しで、指定された丸め (または整数切捨て) を使用して正規化された num が返されます。

   WRITE !,$NORMALIZE(0,0)        ; All integers OK
   WRITE !,$NORMALIZE("",0)       ; Null string is parsed as 0
   WRITE !,$NORMALIZE(4.567,2)    ; Real numbers OK
   WRITE !,$NORMALIZE("4.567",2)  ; Numeric strings OK
   WRITE !,$NORMALIZE(-+.0,99)    ; Leading/trailing signs OK
   WRITE !,$NORMALIZE(+004.500,1) ; Leading/trailing 0's OK
   WRITE !,$NORMALIZE(4E2,-1)     ; Scientific notation OK   

以下の例で、$NORMALIZE の各呼び出しは、num の数値サブセットを返します。

   WRITE !,$NORMALIZE("4,567",0)
     ; NumericGroupSeparators (commas) are not recognized
     ; here validation halts at the comma, and 4 is returned.
   WRITE !,$NORMALIZE("4A",0)
     ; Invalid (nonnumeric) character halts validation
     ; here 4 is returned.

以下の例は、scale パラメータを使用して、返り値を丸める (または切り捨てる) 方法を示します。

   WRITE !,$NORMALIZE(4.55,2)
     ; When scale is equal to the fractional digits of num,
     ; all digits of num are returned without rounding.
   WRITE !,$NORMALIZE(3.85,1)
     ; num is rounded to 1 fractional digit, 
     ; (with values of 5 or greater rounded up) 
     ; here 3.9 is returned.
   WRITE !,$NORMALIZE(4.01,17) 
     ; scale can be larger than number of fractional digits,
     ; and no rounding is peformed; here 4.01 is returned.
   WRITE !,$NORMALIZE(3.85,0)
     ; When scale=0, num is rounded to an integer value.
     ; here 4 is returned.
   WRITE !,$NORMALIZE(3.85,-1)
     ; When scale=-1, num is truncated to an integer value.
     ; here 3 is returned.

メモ

$DOUBLE の数値

$DOUBLE IEEE 浮動小数点数は、バイナリ表現でエンコードされます。ほとんどの 10 進数の小数は、このバイナリ表現では正確には表現できません。$DOUBLE 値が scale 値と共に $NORMALIZE に入力されると、10 進小数の結果がバイナリで表現できないため、返り値に scale で指定されているより多くの小数桁を含む場合がよくあります。したがって、返り値は、以下の例で示すように、表現可能な最も近い $DOUBLE 値に丸める必要があります。

  SET x=1234.1234
  SET y=$DOUBLE(1234.1234)
  WRITE "Decimal: ",$NORMALIZE(x,2),!
  WRITE "Double: ",$NORMALIZE(y,2),!
  WRITE "Dec/Dub: ",$NORMALIZE($DECIMAL(y),2)

$DOUBLE 値を 10 進形式用に正規化する場合、上記の例で示すとおり、$DOUBLE 値を 10 進表現に変換してから結果を正規化する必要があります。

$NORMALIZE は、$DOUBLE("INF") 値および $DOUBLE("NAN") 値を処理し、INF および NAN を返します。

無視される DecimalSeparator 値

$NORMALIZE は、数値の処理を意図しています。num 文字列は、数値として解釈されます。Caché は、$NORMALIZE に数値を渡す前に、その数値をキャノニック形式に変換します。このキャノニック形式の数への変換では、現在のロケールの DecimalSeparator プロパティ値を使用しません

例えば、num に文字列 "00123.4500" を指定すると、現在の DecimalSeparator 値に関係なく、$NORMALIZE はこれをキャノニック形式の数 123.45 として扱います。文字列 "00123,4500" を指定した場合、現在の DecimalSeparator 値に関係なく、$NORMALIZE はこれをキャノニック形式の数 123 (最初の非数値文字で切り捨て) として扱います。

文字列を入力とする関数を使用したい場合、$INUMBER を用います。文字列の結果を生成する関数を使用したい場合、$FNUMBER を用います。

$NORMALIZE と $NUMBER の比較

$NORMALIZE 関数と $NUMBER 関数は両方とも数を検証し、指定された数を検証して返します。

これら 2 つの関数では、検証の条件は異なります。必要に応じて、それぞれの関数を使い分けてください。

  • これら 2 つの関数は、符号付き、または符号なしの整数 (-0 を含む)、科学的記数法の数 ("E" または "e" 付き)、および実数を解析します。ただし、$NUMBER は小数部分を持つ数 (負の 10 進数の指数を持つ科学的記数法を含む) を拒否するように (“I” 形式を使用して) 設定できます。2 つの関数は両方とも、数 (123.45) と数値文字列 ("123.45") を解析します。

  • どちらの関数も、先頭と末尾のゼロを削除します。10 進文字は、ゼロでない値が続かない限り削除されます。

  • NumericGroupSeparator を含む数値文字列。$NUMBERformat パラメータ (または現在のロケールに対する既定値) を基にして、NumericGroupSeparator 文字 (アメリカ形式はコンマ (,)、ヨーロッパ形式はピリオド (.) もしくはアポストロフィ (') と 10 進文字 (アメリカ形式はピリオド (.)、ヨーロッパ形式はコンマ (,)) を解析します。また、NumericGroupSeparator 文字の任意の数を許可し、削除します。例えばアメリカ形式は、数 123456.99 として "123,,4,56.99" を検証します。$NORMALIZE は、NumericGroupSeparator 文字を認識しません。この関数は、数値以外の文字を検出するまで、文字ごとに検証します。例えば "123,456.99" を、数 123 として検証します。

  • 先頭の複数の符号 (+ と -) は、数に対する 2 つの関数両方によって解釈されます。$NORMALIZE だけは、引用符付き数値文字列に入った先頭の複数の符号を受け入れます。

  • 両方の関数は、数の末尾の符号を受け入れません。引用符付きの数値文字列では、$NUMBER は 1 つの (そして唯一の) 末尾の符号を解析します。$NORMALIZE は、複数の末尾符号を解析します。

  • 括弧。$NUMBER は、引用符付き文字列内の符号なしの数を囲む括弧を、負の数を示すものとして解析します。$NORMALIZE は、数値以外の文字として括弧を処理します。

  • 複数の 10 進文字を含む、数値文字列。$NORMALIZE は 2 番目の 10 進文字を検出するまで、文字ごとに検証を行います。例えばアメリカ形式は、"123.4.56" を数 123.4 として検証します。$NUMBER は、1 つ以上の 10 進文字を含む任意の文字列を無効な数として受け入れません。

    他の数値以外の文字を含む数値文字列。$NORMALIZE は、アルファベット文字を検出するまで、文字ごとに検証を行います。これは、"123A456" を数 123 として検証します。$NUMBER は文字列全体を検証し、"123A456" を無効な数として受け入れません。

  • NULL 文字列。$NORMALIZE は、NULL 文字列をゼロ (0) として解析します。$NUMBER は、NULL 文字列を受け入れません。

$NUMBER 関数は、オプションで min/max の範囲チェックを行います。範囲チェックは、$ISVALIDNUM 関数を使用して行うこともできます。

$NORMALIZE$NUMBER、および $ISVALIDNUM はすべて、指定された小数桁数に数を丸めます。$NORMALIZE は、小数桁数の丸め、および実数の丸めまたは切り捨てを行って、整数を返します。例えば、$NORMALIZE は 488.65 を 488.7 または 489 に丸めるかまたは、488 に切り捨てることができます。$NUMBER は、実数または整数を丸めることができます。例えば、$NUMBER は 488.65 を 488.7、489、490、または 500 に丸めることができます。

関連項目

FeedbackOpens in a new tab