数値を検証し、内部形式に変換します。
Synopsis
$INUMBER(fnumber,format,erropt)
$IN(fnumber,format,erropt)
パラメータ
fnumber 内部形式に変換される数値。数値、文字列値、変数名、あるいは有効な Caché ObjectScript 式です。
format 有効な表現である外部数値形式を示す形式指定。以下に示す、単独もしくは複数の有効な 形式コード から成る文字列です。
erropt オプションfnumberformat に基づいて無効であるとみなされた場合に返される式。
概要
$INUMBER 関数は、format で指定した形式を使用して、数値 fnumber を検証します。そして、内部 Caché 形式に変換します。
パラメータ
format
利用可能な形式コードは、以下の通りです。形式の制限に基づいて $INUMBER を指示するために単一、あるいは組み合わせて指定できます。形式コードが入力されない場合、$INUMBER は、fnumber を可能な限り柔軟に検証します (詳細は "最大の柔軟性を提供する NULL 形式" を参照)。
コード 説明
+ 必須符号“L” もしくは “T” 形式コードによる規制がない限り、先行でも後続でも構いません。
- 符号なし。fnumber に符号がない場合もあります。
P 負の数は必ず括弧で囲みます。 非負数は、符号をつけません。
L 先行符号。符号がある場合、fnumber の数字部分の前に置く必要があります。括弧は使用しません。
T 後続符号。符号がある場合、fnumber の数字部分の後に置く必要があります。括弧は使用しません。
, fnumber で、現在のロケールのプロパティによって指定された形式が使用されることを予期します。NumericGroupSeparator (既定は “,”) は、fnumber に表示される場合と表示されない場合がありますが、表示される場合は、小数点の左側に NumericGroupSize (既定は 3) 桁ごとに一貫して表示されている必要があります。
. 現在のロケールとは関係なく、ヨーロッパ形式の数字グループ分離 (“.”) と ヨーロッパ形式の 10 進数記号 (“,”) を使用します。現在のロケールから PlusSign (+) と MinusSign (-) も使用します。ピリオドはオプションですが、ピリオドが存在する場合は常に、小数点の左側に 3 桁 (既定のロケールの NumericGroupSeparator プロパティの値) ごとに表示されなければなりません。
“+”、“-” および “P” 形式コードが存在しないとき
format に “+”、“-”、または “P” コードのいずれも含まれていないときには、fnumber に以下のいずれかを含めることができます。
“L”、“T” および “P” 形式コードが存在しないとき
format が “L”、“T” または “P” 形式コードのいずれも含まないときは、fnumber に付いている符号は先行でも後続でも構いません (ただし、両方には付きません)。
“,” と “.” 形式コードが存在しないとき
format に “,” 形式コードまたは “.” 形式コードのいずれも含まれないとき、オプションとして fnumber は、(存在する場合は) DecimalSeparator の左右いずれかの任意の場所に NumericGroupSeparator 記号を持つことがあります。しかし、各 NumericGroupSeparator は、その左右両隣に少なくとも 1 桁をもたなくてはなりません。
相互排他的形式コード
形式コードには、お互いに衝突するものもあります。形式コードの以下の各セットは、相互排他的です。
相互排他的コードのセットに属する 2 つコードあるいは 3 つのコードを使用すると、<SYNTAX> エラーになります。
最大の柔軟性を提供する NULL 形式
format を NULL 文字列として指定できます。これは、NULL 形式と呼ばれています。NULL 形式が指定されると、$INUMBERは以下の記号規則のうちのいずれかを使用して、fnumber 値を受け入れます。
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 は無効であるとみなします。
これらの例は、異なる形式がどのように $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> エラーが発生します。
以下の場合、<SYNTAX> エラーが発生します。
以下の場合、<ILLEGAL VALUE> エラーが発生します。
$INUMBER と $FNUMBER の相違点
大半の形式コードは、$INUMBER$FNUMBER で同じ意味を持ちますが、各コードによって引き起こされる正確な動作は、検証と変換を実行する上での性質上、関数によって異なります。
特に、$INUMBER での “-” と “+” の形式コードは、$FNUMBER の場合と同じ意味になるわけではありません。$FNUMBERで、“-” と “+” は相互排他的ではありません。“-” は (抑制することによって) MinusSign にのみ影響し、“+” は (挿入することによって) PlusSign にのみ影響します。$INUMBER では、“-” と “+” は相互排他的です。“-” は符号が許可されないという意味であり、“+” は符号が必ず必要であるという意味です。
さらに、$INUMBER は “L” 形式コードをサポートしますが、$FNUMBER はサポートしません。
小数区切り文字
$INUMBER は、数の全体と小数部分の間に区切り文字として、現在のロケールの DecimalSeparator プロパティの値を使用します (形式コードが “.” の場合を除く)。DecimalSeparator の既定値は “.” で、この区切り文字はこのドキュメント全体を通して使用されています。
数値グループ区切り文字
$INUMBER は、fnumber 全体での桁のグループ間の区切り文字として、現在のロケールの NumericGroupSeparator プロパティの値を使用します (既定は “,”)。これらのグループの大きさは、現在のロケールの NumericGroupSize プロパティによって決まります。““.” 形式コードが指定されると、この区切り文字は “.” であり、現在のロケールに関係なく 3 桁ごとに表示されます。
関連項目