【COBOL学習|豆知識】COBOLの「困った」を解決!文字列を数値に変換するNUMVAL関数の魔法

導入:なぜ今、NUMVAL関数なのか

業務システムにおいて、CSVファイルや画面から入力されたデータは、多くの場合「英数字項目(X)」として扱われます。しかし、そのままでは四則演算や比較ができません。かつては、文字列を1文字ずつチェックして数値に変換する複雑なサブルーチンを自作していましたが、現代のCOBOL開発では、標準提供されている「NUMVAL関数」を使うのが鉄則です。これにより、コードの肥大化を防ぎ、保守性を劇的に向上させることができます。

基礎知識:NUMVAL関数とは

NUMVAL関数は、文字列として格納されている値を、計算可能な数値に変換する「組込関数」です。最大の特徴は、文字列内の余分な空白を自動的に無視してくれる点です。例えば、「 123.45 」といった、前後に空白が含まれるデータであっても、正しく「123.45」という数値として認識します。また、符号や小数点も自動で解析するため、CSVデータの読み込み時に非常に強力な武器となります。

実装と解決策

使い方は非常にシンプルです。COMPUTE文の中で関数を呼び出すだけです。
構文:COMPUTE 数値項目 = FUNCTION NUMVAL(文字列項目)

もし、文字列が数値として妥当かどうかを事前に確認したい場合は、NUMVAL-C(通貨記号対応)や、そもそも数値であるかをチェックする論理と組み合わせるのが定石です。

サンプルプログラム

以下のプログラムは、空白混じりの英数字項目を数値に変換し、計算を行う例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-NUMVAL.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STR-DATA PIC X(10) VALUE ” -123.45 “.
01 WS-NUM-RESULT PIC S9(7)V99.

PROCEDURE DIVISION.

  • 文字列を数値に変換して計算対象にする

COMPUTE WS-NUM-RESULT = FUNCTION NUMVAL(WS-STR-DATA) 2.

  • 結果を表示(-246.90と表示されます)

DISPLAY “計算結果: ” WS-NUM-RESULT.

STOP RUN.

応用・注意点:現場で陥りやすい罠

NUMVAL関数を使う上で、必ず注意すべき点が2つあります。

1. 対象データが数字以外の場合:
対象の文字列に数字、符号、小数点以外の文字(例えば「ABC」など)が含まれていると、実行時エラー(データ例外)が発生する可能性があります。外部からのデータを取り込む際は、あらかじめ「NUMVAL関数をかける前に、その文字列が数値のみで構成されているか(NUMERICクラスチェック)」を確認するロジックを必ず入れるようにしてください。

2. 精度の管理:
NUMVAL関数の戻り値は内部的には浮動小数点として扱われます。そのため、非常に大きな桁数や、極めて精密な計算が必要な場合は、関数の結果を格納する受け側の項目の桁数(PICTURE句)が十分か、事前に設計段階で確認しておくことが重要です。

ベテランの知恵として言えば、関数は便利ですが「万能ではない」と心得ること。入力値のチェックとセットで使うことが、バグのない堅牢なシステムを作る秘訣です。

コメント

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