3

comp-3 フィールドを含む算術関数を実行するには、10 進数が 2 桁の数値を持つ PIC X 定義フィールドを数値フィールドに移動する必要があります。これを行う最善の方法は何ですか?

次のように、PIC X から PIC 9 に再定義しました。PIC X(10) から PIC 9(7).99.

しかし、再定義されたフィールドを使用して計算を実行するにはどうすればよいでしょうか。再定義されたフィールドを再定義しますか?

S9(9)v99 として定義された FIELD-RESULT = FIELD-1 (S9(9)V99 として定義) - FIELD-2(私の再定義されたフィールド PIC 9(7).99.

ありがとう!!

4

2 に答える 2

4

組み込みの FUNCTION NUMVAL を見ることができます。

いずれにせよ、メインフレーム上の NUMVAL は、無効なデータ (有効な「編集された」数値ではないテキスト) を指定すると失敗するため、「適切な」データが必要です。

COMPUTE X-TO-NUMERIC = FUNCTION NUMVAL ( text-data )

次のように定義できます。

01  TEXT-NUMBER PIC X(10).
01  EDITED-NUMBER REDEFINES TEXT-NUMBER PIC 9(7).99  (or Z(6)9.99 or Z(7)9.99 or whatever)
01  X-TO-NUMERIC PIC 9(7)V99.

MOVE EDITED-NUMBER TO X-TO-NUMERIC

無効なデータで失敗するか、単に間違っている可能性があります。

または、私の好みの方法:

01  CONVERTED-NUMBER PIC 9(7)V99.
01  FILLER REDEFINES CONVERTED-NUMBER.
    05  CN-INTEGER-PART PIC X(7).
    05  CN-DECIMAL-PART PIC XX.


01  TEXT-NUMBER PIC X(10).
01  FILLER REDEFINES TEXT-NUMBER.
    05  TN-INTEGER-PART  PIC X(7).
    05  TN-DECIMAL-POINT PIC X.
        88  TN-DECIMAL-POINT VALID VALUE ".".
    05  TN-DECIMAL-PART  PIC XX.

IF ( TN-INTEGER-PART NUMERIC )
AND ( TN-DECIMAL-PART NUMERIC )
AND ( TN-DECIMAL-POINT )
    MOVE TN-INTEGER-PART TO CN-INTEGER-PART
    MOVE TN-DECIMAL-PART TO CN-DECIMAL-PART
ELSE
    deal with invalid
END-IF

失敗したり、間違った結果を得たりすることはありません。

編集:参照変更を提案しなかったのはなぜですか? リテラルのみを使用する場合、データ名を使用する場合、人間にとって「読む」のははるかに簡単ではありませんが、データ定義方法よりも明確で遅いため、それらを変更しました。

編集。ここでまた別の質問に引き寄せられて、私は気づきました:この例では. CN-INTEGER-PART、CN-DECIMAL-PART、TN-INTEGER-PART、または TN-DECIMAL-PART を数値フィールドとして定義する必要はありません。

于 2013-01-17T08:56:10.077 に答える
1

COBOL の世界では、数値データ型を "deedit" しようとしています。

「数値」を保持するPIC X(10)フィールドを指定して、それを数値データ型に変換します。この「数値」が常に同じ形式 (7 桁、小数点、小数点以下 2 桁) であることが常に保証されている場合、COBOL でこれを行う従来の方法は次のとおりです。

01.
   02 NUM-AS-PIC         PIC X(10).
   03 NUM-EDITED  REDEFINES NUM-AS-PIC PIC 9(7).99.

01 NUM-DEEDITED            PIC 9(7)V99.

MOVE '1234567.89' TO NUM-AS-PIC      <- alpha-numeric move
MOVE NUM-EDITED   TO NUM-DEEDITED    <- deediting numeric move

ADD 1 TO NUM-DEEDITED                <- numeric computation

MOVE NUM-DEEDITED  TO NUM-EDITED     <- recover explicit decimal (editing)
DISPLAY NUM-AS-PIC                   <- alpha-numeric display

主な欠点は、柔軟性があまりないことです。NUM-AS-PIC正確に正しい形式が含まれていることを常に確認する必要があります。例えば

MOVE '123.45'  TO NUM-AS-PIC

小数点以下の位置が正しくない (右側ではなく左側から埋められる) ため、実行時エラーが発生MOVEし、残りの 4 バイトを構成した後に末尾のスペースが埋め込まれます (スペースは有効な数値ではありません)。

別の一般的な方法は、NUMVAL関数を使用することです。この関数は、編集された有効な数値形式を取り、それを浮動小数点数値表現に変換します。数値には、先頭または末尾にスペースが追加されている場合があります。の結果はNUMVAL、任意の有効な数値データ型に割り当てることができます。例えば:

  MOVE '1234567.89' TO NUM-AS-PIC         <- alpha-numeric move
  COMPUTE NUM-DEEDITED = FUNCTION NUMVAL(NUM-AS-PIC)

  MOVE '123.45' TO NUM-AS-PIC 
  COMPUTE NUM-DEEDITED = FUNCTION NUMVAL(NUM-AS-PIC)

も有効な動きになります。NUM-AS-PICただし、 に含まれる値を有効な浮動小数点数に変換できない場合は、実行時エラーが発生します。例えば:

  MOVE '12A.23' TO NUM-AS-PIC
  COMPUTE NUM-DEEDITED = FUNCTION NUMVAL(NUM-AS-PIC)

それでも実行時エラーが発生します。

悲しいニュースは、COBOL でこれを行う一般的に簡単な方法や確実な方法がないことです。

于 2013-01-17T22:11:45.880 に答える