Skip to main content

ObjectScript の数値

このページでは、ObjectScript の数値と、これらを操作する演算子について説明します。

数値リテラル

数値リテラルに句読点は必要ありません。任意の有効な数値文字を使用して数を指定できます。InterSystems IRIS では、数値が構文的に有効と評価されると、その数値がキャノニック形式に変換されます。

数値リテラルの構文要件は以下のようになります。

  • 0 ~ 9 の 10 進数を含むことができ、少なくともそれらの数値文字のいずれかを含んでいること。先頭または末尾にゼロを使用できます。ただし、InterSystems IRIS で数値をキャノニック形式に変換すると、先頭の整数ゼロが自動的に削除されます。このため、先頭の整数ゼロが重要な数値は、文字列として入力する必要があります。例えば、米国の郵便番号は、02142 のように先頭が整数ゼロの可能性もあるため、数値ではなく文字列として処理する必要があります。

  • 任意のシーケンスで、先頭に任意の数のプラス符号とマイナス符号を使用できます。ただし、プラス符号とマイナス符号は、科学的記数法の文字 “E” を除き、他の任意の文字の後に位置することはできません。数値式では、非符号文字の後の符号は加算または減算として評価されます。数値文字列では、非符号文字の後の符号は非数値文字として評価され、そこで文字列の数値部が終わります。

    InterSystems IRIS では、PlusSign および MinusSign プロパティ値を現在のロケールに使用して、これらの符号文字 (既定では “+” および “-”) を決定します。これらの符号文字はロケールに依存します。ユーザのロケールの PlusSign 文字および MinusSign 文字を決定するには、以下のように GetFormatItem()Opens in a new tab メソッドを呼び出します。

      WRITE ##class(%SYS.NLS.Format).GetFormatItem("PlusSign"),!
      WRITE ##class(%SYS.NLS.Format).GetFormatItem("MinusSign")
  • 小数点区切り文字を 1 つ使用できます。数値式では、2 つ目の小数点区切りを用いると <SYNTAX> エラーとなります。数値文字列では、2 つ目の小数点区切りは最初の非数値文字として評価され、そこで文字列の数値部が終わります。小数点区切り文字は、数値式の最初の文字または最後の文字となることができます。小数点区切り文字の選択は、ロケールに依存します。アメリカ形式では、ピリオド (.) が使用され、これが既定となります。ヨーロッパ形式では、コンマ (,) が使用されます。ユーザのロケールの DecimalSeparator 文字を決定するには、以下のように GetFormatItem()Opens in a new tab メソッドを呼び出します。

      WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
  • 科学的記数法では、“E” (または “e”) を最大で 1 つ使用して 10 を基数とする指数を指定できます。この科学的記数文字 (“E” または “e”) の前には整数または小数、その後には整数を記述する必要があります。

数値リテラル値は、以下をサポートしていません

  • 数値グループ・セパレータは使用できません。これらはロケールに依存します。アメリカ形式ではコンマが使用され、ヨーロッパ形式ではピリオドが使用されます。$INUMBER 関数を使用して数値グループ・セパレータを削除し、$FNUMBER 関数を使用して数値グループ・セパレータを追加することができます。

  • 通貨記号、16 進数文字、その他の非数値文字は使用できません。演算子の前後を除き、空白スペースは使用できません。

  • 末尾にプラス符号やマイナス符号を使用できません。ただし、$FNUMBER 関数は、末尾に符号の付いた文字列として数を表示でき、$NUMBER 関数でこの形式の文字列を取得して、先頭に符号の付いた数に変換します。

  • 負の数 (借方) として数を表す場合、括弧に入れることはできません。ただし、$FNUMBER 関数は、括弧で囲んだ文字列で負の数を表示でき、$NUMBER 関数でこの形式の文字列を取得して、先頭に負符号の付いた数に変換します。

数または数値式には、1 組みの括弧を使用できます。これらの括弧は数の一部ではありませんが、処理の優先順位を決定します。既定では、InterSystems IRIS は、厳密に左から右の順序ですべての処理を実行します。

科学的記数法

ObjectScript で科学的記数法 (指数表現) を指定するには、以下の形式を使用します。

[-]mantissaE[-]exponent 

以下はその説明です。

要素 説明
- オプション — 1 つ以上の単項マイナス演算子または単項プラス演算子。これらのマイナス記号文字とプラス記号文字は構成可能です。キャノニック形式への変換では、科学的記数法を解決した後にこれらの演算子が解決されます。
mantissa 整数または小数。先頭と末尾のゼロおよび末尾の小数点区切り文字が含まれる場合があります。
E 指数表現を区切る演算子。大文字の “E” は標準の指数演算子です。小文字の “e” は、%SYSTEM.ProcessOpens in a new tab クラスの ScientificNotation() メソッドを使用して構成できる指数演算子です。
- オプション — 単一の単項マイナス演算子または単項プラス演算子。負数の指数を指定するために使用できます。これらのマイナス記号文字とプラス記号文字は構成可能です。
exponent 指数 (10 のべき乗値) を指定する整数。先頭にゼロを使用できます。小数点区切り文字は記述できません。

例えば、10 を表現するには 1E1、2800 を表現するには 2.8E3、0.05 を表現するには 5E-2 と記述します。

mantissaE、および exponent の間には、スペースは許可されません。この構文内では、括弧、連結、およびその他の演算子は許可されません。

科学的記数法を解決することが、数値をキャノニック形式に変換する第一歩であるため、一部の変換処理は利用できません。mantissaexponent は数値リテラルである必要があり、変数または算術式にすることはできません。exponent は、(最大でも) 1 つのプラスまたはマイナス記号の付いた整数である必要があります。

詳細は、%SYSTEM.ProcessOpens in a new tab クラスの ScientificNotation()Opens in a new tab メソッドの説明を参照してください。

算術演算子

算術演算子は、オペランドを数値として解釈し、数値結果を生成します。文字列について演算する場合、算術演算子は、"文字列から数値への変換" のルールに従って、文字列をその数値として扱います。算術演算子は以下のとおりです。

単項プラス (+)

単項プラス演算子は、単一のオペランドを数値として解釈します。数値として解釈できない文字に遭遇するまで、文字列の文字を数値として順番に解析することで、これを実行します。そして、適格な数値に変換した文字列の先頭部分を返します (そのような解釈が可能でない場合は 0 を返します)。以下に例を示します。

USER>WRITE + "32 dollars and 64 cents"
32
単項マイナス (-)

単項マイナス演算子は、数値として解釈されるオペランドの符号を反転します。以下に例を示します。

USER>SET x = -60
 
USER>WRITE x
-60
USER>WRITE -x
60

ObjectScript は、二項 (2 オペランド) 算術演算子より単項マイナス演算子を優先します。

数値式の絶対値を返すには、$ZABS 関数を使用します。

加算 (+)

加算演算子は、2 つの数値を加算します。以下に例を示します。

USER>WRITE 2936.22 + 301.45
3237.67
減算 (-)

減算演算子は、ある数値を別の数値から減算します。以下に例を示します。

USER>WRITE 2936.22 - 301.45
2634.77
乗算 (*)

乗算演算子は、2 つの数値を乗算します。以下に例を示します。

USER>WRITE 9 * 5.5
49.5
除算 (/)

除算演算子は、ある数値を別の数値で除算します。以下に例を示します。

USER>WRITE 355 / 113
3.141592920353982301
整数除算 (\)

整数除算演算子は、ある数値を別の数値で除算し、小数値を破棄します。以下に例を示します。

USER>WRITE 355 \ 113
3
モジュロ (#)

2 つのオペランドが正の場合、モジュロ演算子は、右のオペランドで左のオペランドを整数除算した剰余を返します。以下に例を示します。

USER>WRITE 37 # 10
7
USER>WRITE 12.5 # 3.2
2.9
べき乗 (**)

べき乗演算子は、ある数値を、別の数値を指数としてべき乗します。以下に例を示します。

USER>WRITE 9 ** 2
81

べき乗計算は、$ZPOWER 関数を使用しても可能です。

数値的等価

等号 (=) および不等号 ('=) の演算子を使用して、2 つの数値を比較できます。

等価演算子は、左のオペランドが右のオペランドと等しいかどうかをテストします。以下に例を示します。

USER>WRITE 9 = 6
0

不等価 ('=) 演算子を使用することもできます。

その他の数値比較

前述の等価 (=) 演算子と不等価 ('=) 演算子は、文字列で使用できます。これに対し、ここで説明する演算子は数値でのみ使用します。ここで説明する演算子は、常にオペランドを数値として解釈し ("文字列から数値への変換" を参照)、ブーリアン値の結果を生成します。

より小さい関係演算子 (<)

より小さい関係演算子は、左のオペランドが右のオペランドより小さいかどうかをテストします。以下に例を示します。

USER>WRITE 9 < 6
0
より大きい関係演算子 (>)

より大きい関係演算子は、左のオペランドが右のオペランドより大きいかどうかをテストします。以下に例を示します。

USER>WRITE 15 > 15
0
以下演算子 (<= または '>)

以下演算子は、左のオペランドが右のオペランド以下であるかどうかをテストします。以下に例を示します。

USER>9 <= 6
0 
以上演算子 (>= または '<)

以上演算子は、左のオペランドが右のオペランド以上であるかどうかをテストします。以下に例を示します。

USER>WRITE 15 >= 15
1

キャノニック形式の数値

ObjectScript では、数に対する数値演算のすべてをキャノニック形式で実行します。例えば、数値 +007.00 の長さは 1 になり、文字列 "+007.00" の長さは 7 になります。

InterSystems IRIS で数をキャノニック形式に変換するときには、以下の手順が実行されます。

  1. 科学的記数法の指数が解決されます。例えば、3E4 は 30000 に変換され、3E-4 は .0003 に変換されます。

  2. 先頭の符号が解決されます。まず、複数の符号が 1 つの符号に解決されます (例えば、2 つのマイナス符号が 1 つのプラス符号になります)。次に、先頭にあるプラス符号が削除されます。$FNUMBER 関数を使用すると、InterSystems IRIS のキャノニック形式の正の数にプラス記号を明示的に指定 (追加) できます。

    Note:

    ObjectScript は、先頭のプラス記号とマイナス記号の任意の組み合わせを解決します。SQL では、2 つの連続したマイナス記号は、1 行コメント文字として解析されます。したがって、先頭に 2 つの連続したマイナス記号を付けて SQL で数値を指定すると、SQLCODE -12 エラーになります。

  3. 先頭と末尾のゼロがすべて削除されます。これには、1 より小さい小数の先頭の整数ゼロの削除も含まれます。例えば、0.66.66 になります。

    • キャノニック形式の小数に整数のゼロを追加するには、$FNUMBER 関数または $JUSTIFY 関数を使用します。.660.66 になります。

    • キャノニック形式以外の小数から整数ゼロを削除するには、単項プラス演算子を使用して、数値文字列からキャノニック形式の数値への変換を行います。例えば、+$PIECE("65798,00000.66",",",2) のタイムスタンプの秒の小数部 00000.66.66 になります。

    この変換の一環として、ゼロの小数は 0 に単純化されます。表現方法 (0.0.0.000) にかかわらず、すべてのゼロ値は 0 に変換されます。

  4. 末尾の小数点区切りが削除されます。

  5. -0 は 0 に変換されます。

  6. 算術演算と数値の連結が実行されます。InterSystems IRIS は、こうした演算を厳密に左から右の順に実行します。このような演算は、キャノニック形式の数で実行されます。詳細は、後述の "数字の連結" を参照してください。

InterSystems IRIS のキャノニック形式の数は、その他のインターシステムズのソフトウェアで使用されているキャノニック形式の数とは異なります。

  • ODBC : 整数ゼロの小数は、1 つのゼロ整数を含む ODBC に変換されます。そのため、.66000.66 は、どちらも 0.66 になります。$FNUMBER 関数または $JUSTIFY 関数を使用すると、InterSystems IRIS のキャノニック形式の小数に整数のゼロを追加できます。

  • JSON : 先頭の 1 つのマイナス記号のみが許容されます。先頭のプラス記号や複数の記号は許容されません。

    指数は許容されますが、解決されません。3E4 は、3E4 として返されます。

    先頭のゼロは許容されません。末尾のゼロは削除されません。

    整数ゼロの小数には、1 つのゼロ整数が必要です。したがって、.66000.66 は無効な JSON の数値になりますが、0.660.660000 は有効な JSON の数値となります。

    末尾の小数点記号は許容されません。

    ゼロの値は、変換されません。0.0-0、および -0.000 は、有効な JSON の数値として変更なしで返されます。

数字の連結

連結演算子 (_) を使用して、ある数と別の数を連結できます。InterSystems IRIS は、まずそれぞれの数値をキャノニック形式に変換してから、その結果に対して文字列連結を実行します。したがって、12_34、12_+34、12_--34、12.0_34、12_0034.0、12E0_34 はすべて 1234 になります。12._34 の連結は 1234 になりますが、12_.34 の連結は 12.34 になります。12_-34 の連結は文字列 “12-34” になります。

InterSystems IRIS は、キャノニック形式に変換した後の数に対して、数値の連結と算術演算を実行します。こうした演算は厳密に左から右の順に実行されます。ただし、演算の優先順位を決める括弧が指定されている場合を除きます。以下の例では、この結果について説明しています。

  WRITE 7_-6+5 // returns 12

この例では、連結によって文字列 "7-6" が返されます。これが、キャノニック形式の数でないことは明白です。InterSystems IRIS は、最初の非数値文字 (埋め込みのマイナス記号) を切り捨てることで、この文字列をキャノニック形式の数に変換します。その後で、このキャノニック形式の数を使用して次の演算 7 + 5 = 12 を実行します。

浮動小数点数

InterSystems IRIS は、浮動小数点数を表すために使用できる 2 つの異なる数値タイプをサポートしています。

  • 10 進数の浮動小数点 : 既定では、InterSystems IRIS は、固有の 10 進数の浮動小数点標準 ($DECIMAL 数) を使用して小数を表します。これは、ほとんどの場合の優先形式であり、IEEE バイナリ浮動小数点よりも、高いレベルの精度が得られます。これは、InterSystems IRIS がサポートしているすべてのシステム・プラットフォームで一貫しています。10 進数の浮動小数点は、データ・ベースの値で優先的に使用されます。特に、0.1 などの小数は、10 進数の浮動小数記数法を使用して正確に表現できますが、小数 0.1 (およびほとんどの 10 進数の小数) は IEEE バイナリ浮動小数点では近似値で表現できるだけです。

    内部的に、10 進算術は M*(10**N) 形式の数を使用して実行されます。M は -9223372036854775808 から 9223372036854775807 の整数値を含む整数の仮数で、N は -128 から 127 の整数値を含む 10 進指数です。仮数は 64 ビット符号付整数で表され、指数は 8 ビット符号付バイトで表されます。

    10 進浮動小数点の平均精度は小数桁数 18.96 桁です。仮数が 1000000000000000000 から 9223372036854775807 の小数の精度は正確に 19 桁で、922337203685477581 から 999999999999999999 の有効な小数の精度は正確に 18 桁です。IEEE バイナリ浮動小数点は、精度は低いものの (精度は小数桁数約 15.95 桁)、小数文字列としての IEEE バイナリ表現の正確な無限精度の値は、1000 桁以上の有効小数桁数を持つことができます。

    以下の例では、$DECIMAL 関数は小数と 25 桁の整数を取り、19 桁の精度/有効桁数に丸められた小数を返します。

    USER>WRITE $DECIMAL(1234567890.123456781818181)
    1234567890.123456782
    USER>WRITE $DECIMAL(1234567890123456781818181)
    1234567890123456782000000
    
  • IEEE バイナリ浮動小数点 : IEEE 倍精度バイナリ浮動小数点は、小数を表現する業界標準の方法です。IEEE 浮動小数点数は、バイナリ表現でエンコードされます。バイナリ浮動小数点表現は、ほとんどのコンピュータがバイナリ浮動小数点演算のための高速ハードウェアを搭載しているため、通常、高速計算を実行する場合に優先的に使用されます。

    内部的に、IEEE バイナリ算術は S*M*(2**N) 形式の数を使用して実行されます。S は -1 または +1 の値を含む符号で、M は 1 番目と 2 番目のバイナリ・ビット間に 2 進小数点がある 53 ビットのバイナリ小数値を含む仮数で、N は -1022 から 1023 の整数値を含む 2 進指数です。このため、表現は 64 ビットで構成されます。S は 1 つの符号ビット、指数 N は次の 11 ビットに格納され (2 つの追加の値が予約されます)、仮数 M は >=1.0 かつ <2.0 で最後の 52 ビットを含み、合計 53 バイナリ・ビットの精度となります。(M の最初のビットは常に 1 であるため、64 ビット表現に出現する必要はありません。)

    倍精度バイナリ小数点の精度は 53 バイナリ・ビットで、小数点以下約 15.95 桁の精度に相当します。(対応する 10 進数の精度は 15.35 から 16.55 桁の間で変動します。)

    バイナリ表現は、0.1 などの小数をバイナリ小数の有限シーケンスとして表現できないため、10 進数の小数と正確には一致しません。ほとんどの小数はこのバイナリ表現では正確に表すことができないため、IEEE 浮動小数点数は対応する InterSystems の 10 進浮動小数点数とは若干異なる場合があります。IEEE 浮動小数点数が小数として表示されるとき、バイナリ・ビットが 18 桁を大幅に超える小数桁数の小数に変換されることがよくあります。これは、IEEE 浮動小数点数が InterSystems の 10 進浮動小数点数より精度が高いことを意味するわけではありません。IEEE 浮動小数点数は、InterSystems の 10 進数よりも大きい数および小さい数を表現できます。

    以下の例では、$DOUBLE 関数は 17 桁の整数のシーケンスを取り、小数点以下の有効桁数約 16 桁の値を返します。

    USER>FOR i=12345678901234558:1:12345678901234569 {W $DOUBLE(i),!}
    12345678901234558
    12345678901234560
    12345678901234560
    12345678901234560
    12345678901234562
    12345678901234564
    12345678901234564
    12345678901234564
    12345678901234566
    12345678901234568
    12345678901234568
    12345678901234568
    

    IEEE バイナリ浮動小数点は、特殊な値 INF (無限大) と NAN (非数値) をサポートします。詳細は、"$DOUBLE" 関数を参照してください。

    INF および NAN 値を扱うための IEEEError 設定と、$LIST 構造データ内の IEEE 浮動小数点数の圧縮を扱うための ListFormat 設定を使用して、IEEE 浮動小数点数の処理を構成できます。どちらも、%SYSTEM.ProcessOpens in a new tab クラス・メソッド $SYSTEM.Process.IEEEError()Opens in a new tab を使用して、現在のプロセスに表示および設定できます。InterSystems IRIS の管理ポータルで [システム管理] から [構成][追加の設定][互換性] を選択して、システム全体の既定値を設定できます。

$DOUBLE 関数を使用して、InterSystems IRIS 標準の浮動小数点数を IEEE 浮動小数点数に変換できます。また、$DECIMAL 関数を使用して、IEEE 浮動小数点数を InterSystems IRIS 標準の浮動小数点数に変換できます。

既定では、InterSystems IRIS は小数をキャノニック形式に変換して、先頭のゼロをすべて削除します。したがって、0.66.66 となります。$FNUMBER (ほとんどの形式) および $JUSTIFY (3 パラメータ形式) は常に、最低 1 桁の整数を伴う小数を返します。これらの関数のいずれかを使用した場合、.660.66 となります。

$FNUMBER および $JUSTIFY を使用すれば、指定した小数桁数に対して丸めや埋め込みを行うことができます。InterSystems IRIS では、5 以上を切り上げて、4 以下を切り捨てます。埋め込みでは、ゼロを必要な小数桁だけ追加します。少数を整数に丸めた場合、小数点区切り文字は削除されます。整数をゼロ・パディングして小数にした場合、小数点区切り文字が追加されます。

極端に大きな数字

正確に表現できる最大の整数は、19 桁の整数の -9223372036854775808 と 9223372036854775807 です。なぜなら、これらの数値は 64 ビット符号付き整数で表現できる最大数だからです。これを超える整数は、この 64 ビット制限に収まるように自動的に丸められます。詳細は、以下の例を参照してください。

  SET x=9223372036854775807
  WRITE x,!
  SET y=x+1
  WRITE y

同様に、128 を超える指数も、64 ビット符号付き整数の表現になるように自動的に丸められます。詳細は、以下の例を参照してください。

  WRITE 9223372036854775807e-128,!
  WRITE 9223372036854775807e-129

この丸めにより、19 桁の整数を超える数になる算術演算は、下位の桁がゼロに置き換えられます。これにより、以下のような状況となる可能性があります。

  SET longnum=9223372036854775790
  WRITE longnum,!
  SET add17=longnum+17
  SET add21=longnum+21
  SET add24=longnum+24
  WRITE add17,!,add24,!,add21,!
  IF add24=add21 {WRITE "adding 21 same as adding 24"}

InterSystems IRIS でサポートされる最大の 10 進数の浮動小数点数は 9.223372036854775807E145 です。サポートされる最大の $DOUBLE 値 (INFINITY への IEEE オーバーフローが無効であると想定) は 1.7976931348623157081E308 です。$DOUBLE 型は、InterSystems IRIS の 10 進数型よりも広い範囲の値をサポートしますが、InterSystems IRIS の 10 進数型の方が高精度をサポートします。InterSystems IRIS の 10 進数型の精度は約 18.96 桁 (普通は 19 桁ですが、時折 18 桁の精度) で、$DOUBLE 型の通常の精度は約 15.95 桁 (53 バイナリ桁) です。既定では、InterSystems IRIS は数値リテラルを 10 進数の浮動小数点数として表現します。ただし、数値リテラルが InterSystems IRIS の 10 進数で表現できる数値より大きい場合 (9.223372036854775807E145 より大きい場合)、InterSystems IRIS はその数値を $DOUBLE 表現に自動的に変換します。

1.7976931348623157081E308 (308 桁または 309 桁) より大きな数値の場合、<MAXNUMBER> エラーが発生します。

10 進数の浮動小数点からバイナリ浮動小数点への自動変換のため、丸めの動作は、9.223372036854775807E145 (整数に応じて 146 桁または 147 桁) で変更されます。詳細は、以下の例を参照してください。

  TRY {
    SET a=1
    FOR i=1:1:310 {SET a=a_1 WRITE i+1," digits = ",+a,! }
  }
  CATCH exp { WRITE "In the CATCH block",!
              IF 1=exp.%IsA("%Exception.SystemException") {
                  WRITE "System exception",!
                  WRITE "Name: ",$ZCVT(exp.Name,"O","HTML"),!
                  WRITE "Location: ",exp.Location,!
                  WRITE "Code: "
                }
              ELSE { WRITE "Some other type of exception",! RETURN }
              WRITE exp.Code,!
              WRITE "Data: ",exp.Data,! 
              RETURN
  }
  TRY {
    SET a=9
    FOR i=1:1:310 {SET a=a_9 WRITE i+1," digits = ",+a,! }
  }
  CATCH exp { WRITE "In the CATCH block",!
              IF 1=exp.%IsA("%Exception.SystemException") {
                  WRITE "System exception",!
                  WRITE "Name: ",$ZCVT(exp.Name,"O","HTML"),!
                  WRITE "Location: ",exp.Location,!
                  WRITE "Code: "
              }
              ELSE { WRITE "Some other type of exception",! RETURN }
              WRITE exp.Code,!
              WRITE "Data: ",exp.Data,! 
              RETURN
  }

309 桁より大きな数値は数値文字列として表現できます。この値は数値ではなく文字列として保存されるため、丸めも <MAXNUMBER> エラーも適用されません。

  SET a="1"
  FOR i=1:1:360 {SET a=a_"1" WRITE i+1," characters = ",a,! }

許可される最大桁数を超える数値になる指数は、<MAXNUMBER> エラーを生成します。指数の最大許容数は、その指数を受け入れる数のサイズによって異なります。1 桁の仮数の場合、最大指数は 307 または 308 です。

大きな数字に関する考慮事項の詳細は、"インターシステムズ・アプリケーションでの数値の計算" を参照してください。

文字列から数値への変換

このページで紹介したほとんどの演算子は、オペランドを数値として解釈します。このセクションでは、この解釈が行われる方法について説明します。まず、基本的な用語は以下のとおりです。

  • 数値文字列は、すべて数字で構成される文字列リテラルです。例えば、"123""+123"".123""++0007""-0" となります。

  • 部分的数値の文字列は、数字で始まり、非数値の文字が続く文字列リテラルです。例えば、"3 blind mice""-12 degrees" となります。

  • 非数値の文字列は、数値ではない文字で始まる文字列リテラルです。例えば、" 123""the 3 blind mice""three blind mice" となります。

数値文字列

数値文字列または部分的文字列を算術式で使用する場合、文字列は数値として解釈されます。文字列で左から右に数値文字をスキャンしてこの数値を取得し、数値リテラルと解釈できる開始文字の最長シーケンスを見つけます。以下の文字が可能です。

  • 0 から 9 までの数字。

  • PlusSign プロパティ値および MinusSign プロパティ値。既定では、それらは + および - の文字となりますが、ロケールに依存します。%SYS.NLS.Format.GetFormatItem()Opens in a new tab メソッドを使用して、現在の設定を返します。

  • DecimalSeparator プロパティ値。既定では、これは . の文字となりますが、ロケールに依存します。%SYS.NLS.Format.GetFormatItem()Opens in a new tab メソッドを使用して、現在の設定を返します。

  • 文字の e および E は、シーケンス内で 4E3 などの科学的記数法を表す場合に、数値文字列の一部を含むことができます。

NumericGroupSeparator プロパティ値 (既定では、, の文字) は、数値文字とは見なされないことに注意してください。したがって、文字列 "123,456" は部分的数値文字列となり、数 "123" に分解されます。

数値文字列および部分的数値文字列は、算術演算 (加算および減算) および「より大きい/より小さい」などの比較演算 (<、>、<=、>=) に優先して、キャノニック形式に変換されます。数値文字列は等値比較 (=、'=) に優先して、キャノニック形式へ変換されません。この理由は、それらの演算子が文字列比較にも使用されるためです。

以下の例は、数値文字列の算術比較を示しています。

USER>WRITE "3" + 4
7
USER>WRITE "003.0" + 4
7
USER>WRITE "++--3" + 4
7
USER>WRITE "3 blind mice" + 4
7

以下の例は、数値文字列の < (より小さい) 比較を示しています。

USER>WRITE "3" < 4
1
USER>WRITE "003.0" < 4
1
USER>WRITE "++--3" < 4
1
USER>WRITE "3 blind mice" < 4
1

以下の例は、数値文字列の <= 比較を示しています。

USER>WRITE "4" <= 4
1
USER>WRITE "004.0" <= 4
1
USER>WRITE "++--4" <= 4
1
USER>WRITE "4 horsemen" <= 4
1

以下の例は、数値文字列の等値比較を示しています。非キャノニック形式の数値文字列は、数値ではなく、文字列として比較されます。-0 は非キャノニック形式の数値文字列です。したがって、数値ではなく、文字列として比較されます。

USER>WRITE "4" = 4.00
1
USER>WRITE "004.0" = 4
0
USER>WRITE "++--4" = 4
0
USER>WRITE "4 horsemen" = 4
0
USER>WRITE "-4" = -4
1
USER>WRITE "0" = 0
1
USER>WRITE "-0" = 0
0
USER>WRITE "-0" = -0
0

非数値文字列

文字列の先頭の文字が数値文字ではない場合、すべての算術演算に対する文字列の数値は 0 となります。<、>、'>、<=、'<、および >= による比較演算でも、数値ではない文字列は 0 として扱われます。等号は数値的等値演算子および文字列比較演算子の両方として使用されるので、= および '= の演算では文字列比較が優先されます。PlusSign プロパティ値 (既定では +) を追加することで、文字列の数値的評価を強制することができます (例 : "+123")。x および y が異なる非数値文字列 (x=”Fred”、y=”Wilma” など) である場合、結果は以下の論理値となります。

x, y x, x +x, y +x, +y +x, +x
x=y は FALSE x=x は TRUE +x=y は FALSE +x=+y は TRUE +x=+x は TRUE
x'=y は TRUE x'=x は FALSE +x'=y は TRUE +x'=+y は FALSE +x'=+x は FALSE
x<y は FALSE x<x は FALSE +x<y は FALSE +x<+y は FALSE +x<+x は FALSE
x<=y は TRUE x<=x は TRUE +x<=y は TRUE +x<=+y は TRUE +x<=+x は TRUE

非常に大きな数値文字列

通常、数値文字列は ObjectScript の 10 進数値に変換されます。ただし、非常に大きな数値の場合 (9223372036854775807E127 より大きい)、常に数値文字列を 10 進数値に変換できるとは限りません。数値文字列を 10 進数値に変換すると <MAXNUMBER> エラーが発生する場合、InterSystems IRIS では代わりに IEEE バイナリ値に変換します。InterSystems IRIS は次の操作を実行して、数値文字列を数に変換します。

  1. 数値文字列を 10 進数の浮動小数点数に変換します。この操作で <MAXNUMBER> エラーが発生する場合は、手順 2 に進みます。それ以外の場合、10 進数値がキャノニック形式の数として返されます。

  2. $SYSTEM.Process.TruncateOverflow()Opens in a new tab メソッド・ブーリアン値を確認します。0 (既定) の場合、手順 3 に進みます。それ以外の場合、オーバーフローする 10 進数値が返されます (メソッドの説明を参照)。

  3. 数値文字列を IEEE バイナリ浮動小数点数に変換します。この操作で <MAXNUMBER> エラーが発生する場合は、手順 4 に進みます。それ以外の場合、IEEE バイナリ値がキャノニック形式の数として返されます。

  4. $SYSTEM.Process.IEEEError()Opens in a new tab メソッド・ブーリアン値を確認します。この値に応じて、INF / -INF が返されるか、<MAXNUMBER> エラーが発生します。

関連項目

FeedbackOpens in a new tab