【COBOL学習|豆知識】NUMVAL関数の落とし穴!「複数小数点」による実行時エラーを未然に防ぐテクニック

導入:なぜNUMVALの「実行時エラー」が怖いのか

COBOLの組込関数 NUMVAL は、文字列を数値に変換する際に非常に便利です。しかし、現場のベテランなら一度は経験したことがあるでしょう。「実行時エラーによる異常終了」という悪夢を。特に、外部から取り込んだCSVデータや画面入力データに「12.34.56」のような不正な文字列が混入していた場合、NUMVALは問答無用でプログラムを停止させます。バッチ処理の途中でこれが起きると、リカバリ作業は非常に骨が折れます。本稿では、この「複数小数点」問題を安全に回避するためのバリデーション手法を解説します。

基礎知識:NUMVAL関数の仕組み

NUMVAL関数は、英数字項目(PIC Xなど)の文字列を内部浮動小数点形式に変換する関数です。この関数の特徴は、文字列内の空白を無視し、符号や小数点を適切に解釈してくれる点にあります。しかし、あくまで「数値として正当な形式」であることが前提です。小数点(.)が2つ以上存在したり、符号(+ / -)が数値の途中にあるような「数値としてあり得ない文字列」を渡すと、ランタイムは例外をスローします。

実装・解決策:バリデーションの徹底

NUMVALを呼び出す前に、対象の項目が「数値として変換可能か」をチェックするロジックを挟むのが鉄則です。最も原始的かつ確実な方法は、文字列内の「.」の数をカウントすることです。

サンプルプログラム:安全な変換処理の実装例

以下に、小数点チェックを組み込んだ安全な変換ルーチンを紹介します。

IDENTIFICATION DIVISION.
PROGRAM-ID. CHECK-NUMVAL.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-INPUT-DATA PIC X(20) VALUE “123.45.67”.
01 WS-NUMERIC-VALUE USAGE COMP-2.
01 WS-DOT-COUNT PIC 9(02) VALUE 0.
01 WS-IDX PIC 9(02).

PROCEDURE DIVISION.
> 文字列内の小数点をカウントする
MOVE 0 TO WS-DOT-COUNT.
PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 20
IF WS-INPUT-DATA(WS-IDX:1) = “.”
ADD 1 TO WS-DOT-COUNT
END-IF
END-PERFORM.

> 小数点が1つ以下なら変換処理を実行
IF WS-DOT-COUNT <= 1 COMPUTE WS-NUMERIC-VALUE = FUNCTION NUMVAL(WS-INPUT-DATA) DISPLAY "変換成功: " WS-NUMERIC-VALUE ELSE > エラー時はログ出力し、異常終了を回避する
DISPLAY “エラー: 不正なフォーマットが検出されました (” WS-INPUT-DATA “)”
END-IF.

GOBACK.

応用・注意点:現場での運用アドバイス

1. NUMVAL-C関数の検討
もし対象データが「1,234.56」のようにカンマを含んでいる場合は、NUMVAL-C関数を使用してください。ただし、こちらも複数小数点の検知は行われないため、同様の事前チェックが必要です。

2. 検証ロジックの共通化
もし複数の画面やバッチで同じチェックが必要なら、このロジックを「サブルーチン(CALL)」として独立させましょう。個別のプログラムでロジックを書くと、修正漏れが発生する原因となります。

3. ログの重要性
エラーを検知した際は、単に処理をスキップするだけでなく、どの項目でエラーが発生したのかをシステムログに詳細に出力してください。運用担当者が後から原因(入力元のデータ不備など)を特定できるようにしておくことが、ベテランの責任ある実装です。

コメント

タイトルとURLをコピーしました