数値を検証し、内部形式に変換します。
Synopsis
$INUMBER(fnumber,format,erropt)
$IN(fnumber,format,erropt)
“+”、“-” および “P” 形式コードが存在しないとき
format に +、-、または P コードのいずれも含まれていないときには、
fnumber に以下のいずれかを含めることができます。
-
-
PlusSign 個別指定プロパティ (既定は "+") あるいは MinusSign 個別指定プロパティ (既定は "-") の両方ではなくどちらか一方。この符号の位置は、指定すれば、"L" あるいは "T" のどちらかにより決定。
-
“L”、“T” および “P” 形式コードが存在しないとき
format が L、T または P 形式コードのいずれも含まないときは、
fnumber に付いている符号は先行でも後続でも構いません (ただし、両方には付きません)。
format に , 形式コードまたは . 形式コードのいずれも含まれないとき、オプションとして
fnumber は、(存在する場合は) DecimalSeparator の左右いずれかの任意の場所に NumericGroupSeparator 記号を持つことがあります。しかし、各 NumericGroupSeparator は、その左右両隣に少なくとも 1 桁をもたなくてはなりません。
形式コードには、お互いに衝突するものもあります。形式コードの以下の各セットは、相互排他的です。
相互排他的コードのセットに属する 2 つコードあるいは 3 つのコードを使用すると、<SYNTAX> エラーになります。
format を NULL 文字列として指定できます。これは、NULL 形式と呼ばれています。NULL 形式が指定されると、
$INUMBERは以下の記号規則のうちのいずれかを使用して、
fnumber 値を受け入れます。
-
-
前か後の両方ではなく、どちらか一方に MinusSign
-
前か後の両方ではなく、どちらか一方に PlusSign
-
NULL 形式を指定したとき、
fnumber は、オプションとして、(存在する場合は) DecimalSeparator の左右いずれかの任意の場所に NumericGroupSeparator 記号を持つことがあります。しかし、各 NumericGroupSeparator は、その左右両隣に少なくとも 1 桁をもたなくてはなりません。符号に関する規約は柔軟ですが、前と後の空白とゼロは無視されます。したがって、以下の 2 つのコマンド
WRITE !,$INUMBER("+1,23,456,7.8,9,100","")
WRITE !,$INUMBER("0012,3456,7.891+","")
は両方とも有効で、既定のロケールに対応してフォーマットされた同じ数を返します。しかし、以下の例はどうでしょうか。
WRITE $INUMBER("1,23,,345,7.,8,9,","")
これは、隣接したコンマ、隣接したピリオドとコンマ、後に続くコンマなので無効です。これは、<ILLEGAL VALUE> エラーを返します。
指定した形式コードに関係なく、
$INUMBER は常に前と後にあるスペースやゼロを無視しますが、以下の特性のいずれかがある場合
fnumber は無効であるとみなします。
-
-
1 つ以上の PlusSign あるいは MinusSign
-
-
-
-
-
-
-
-
-
-
現在のロケールで指定された DecimalSeparator (
format が . を含まない場合)
-
現在のロケールで指定された NumericGroupSeparator (
format が . を含まない場合)
-
現在のロケールで指定された PlusSign プロパティ (
format が .を含まない場合)
-
現在のロケールで指定された MinusSign プロパティ (
format が . を含ま ない場合)
-
-
-
-
これらの例は、異なる形式がどのように
$INUMBER の動作に影響するかを示しています。すべて、現在のロケールが既定のロケールであると仮定します。
以下の例では、L 形式コードのため
$INUMBER は先行マイナス符号を受け入れ、-123456789.12345678 を返します。
WRITE $INUMBER("-123,4,56,789.1234,5678","L")
以下の例では、符号が前にあるのに、T 形式コードが符号は必ず後にくるように指定するので、
$INUMBER は <ILLEGAL VALUE> エラーを生じます。
WRITE $INUMBER("-123,4,56,789.1234,5678","T")
以下の例では、最初の
$INUMBER は成功し、負の数を返します。2番目の
$INUMBER では、
fnumber は符号を含んでいますが、P 形式コードでは、負の数に符号を付けるのではなく括弧で囲むように指定されているので、<ILLEGAL VALUE> エラーが発生します。
WRITE !,$INUMBER("(123,4,56,789.1234,5678)","P")
WRITE !,$INUMBER("-123,4,56,789.1234,5678","P")
以下の例では、符号があるのに、- 形式コードが符号を使用しないように指定するので、
$INUMBER は <ILLEGAL VALUE> エラーを生じます。
WRITE $INUMBER("-123,4,56,789.1234,5678","-")
以下の例では、
$INUMBER は失敗しますが、符号の不正使用を原因とするエラーは発生せず、
erropt として指定されている文字列 ERR をその値として返します。
WRITE $INUMBER("-123,4,56,789.1234,5678","-","ERR")
以下の例は、-23456789.123456789 を返します。先行符号が付いていることは、L で指定される形式に従っており、小数部分の左側に 3 桁ごとに必ずコンマがあり、右側にはコンマがないことは、, コードで指定される厳密な形式に従っているため、
$INUMBER は指定した
fnumber を有効な値として受け入れます。
WRITE $INUMBER("-23,456,789.123456789","L,")
以下の場合、<FUNCTION> エラーが発生します。
-
format パラメータが形式コードとして定義されていない文字を含む場合
-
format パラメータが相互排他的形式コードを含み、いずれも P でない場合
以下の場合、<SYNTAX> エラーが発生します。
-
format パラメータが相互排他的形式コードを含み、そのいずれかが P である場合
以下の場合、<ILLEGAL VALUE> エラーが発生します。
大半の形式コードは、
$INUMBER と
$FNUMBER で同じ意味を持ちますが、各コードによって引き起こされる正確な動作は、検証と変換を実行する上での性質上、関数によって異なります。
特に、
$INUMBER での - と + の形式コードは、
$FNUMBER の場合と同じ意味になるわけではありません。
$FNUMBERで、- と + は相互排他的ではありません。- は (抑制することによって) MinusSign にのみ影響し、+ は (挿入することによって) PlusSign にのみ影響します。
$INUMBER では、- と + は相互排他的です。- は符号が許可されないという意味であり、+ は符号が必ず必要であるという意味です。
$INUMBER は、数の全体と小数部分の間に区切り文字として、現在のロケールの DecimalSeparator プロパティの値を使用します (形式コードが . の場合を除く)。DecimalSeparator の既定値は . で、この区切り文字はこのドキュメント全体を通して使用されています。
$INUMBER は、
fnumber 全体での桁のグループ間の区切り文字として、現在のロケールの NumericGroupSeparator プロパティの値を使用します (既定は ,)。これらのグループの大きさは、現在のロケールの NumericGroupSize プロパティによって決まります。. 形式コードが指定されると、この区切り文字は . であり、現在のロケールに関係なく 3 桁ごとに表示されます。