【COBOL学習|初心者向け】通貨データも怖くない!NUMVAL-C関数で文字列を数値へスマートに変換しよう

導入:なぜNUMVAL-Cが重要なのか

COBOLで開発をしていると、画面や帳票から読み取った「1,234,567円」や「$1,000」といった、カンマや通貨記号が含まれた文字列を、計算可能な数値データとして扱いたい場面によく遭遇します。
初心者のうちは、文字列を1文字ずつスキャンして記号を取り除く処理を書こうとしがちですが、それは非常に手間がかかり、バグの温床にもなります。そんな時に活躍するのがNUMVAL-C関数です。これを使えば、面倒な文字列操作を一切不要にし、一行のコードで安全に数値変換が可能になります。

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

NUMVAL-C関数は、COBOLの「組込関数」の一つです。組込関数とは、言語仕様としてあらかじめ用意されている便利な部品のことです。
この関数は、「通貨記号を含む文字列」から「数値」を抽出します。

  • 第1引数:変換したい文字列
  • 第2引数:取り除きたい通貨記号(省略した場合はデフォルトの通貨記号が対象になります)

これらを指定するだけで、カンマや通貨記号を自動的に無視し、純粋な数値として計算できる形式に変換してくれます。

実装:変換の手順

実装は非常にシンプルです。COMPUTE文の中でFUNCTIONキーワードを使い、変換先の数値項目に代入するだけです。
ポイントは、変換先となる受け取り側の項目が、必ず数値項目(PIC 9やPIC S9など)であること。文字列のまま受け取ろうとするとエラーになるので注意してください。

サンプルプログラム

以下のコードは、通貨記号やカンマを含む文字列を数値に変換し、計算を行う例です。コピー&ペーストして確認してみてください。

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-NUMVAL-C.
DATA DIVISION.
WORKING-STORAGE SECTION.

  • 変換元の文字列(カンマや通貨記号を含む)

01 WS-STRING PIC X(20) VALUE “$1,234.56”.

  • 変換先の数値項目(計算可能)

01 WS-NUM PIC S9(7)V99.

PROCEDURE DIVISION.
> NUMVAL-Cを使用して文字列を数値に変換
> 第2引数に”$”を指定して、ドル記号を無視するように指示
COMPUTE WS-NUM = FUNCTION NUMVAL-C(WS-STRING, “$”).

> 結果を表示
DISPLAY “変換後の数値: ” WS-NUM.

> 数値として計算が可能か確認
COMPUTE WS-NUM = WS-NUM + 100.
DISPLAY “100を加算した結果: ” WS-NUM.

STOP RUN.

応用・注意点:現場で役立つポイント

現場で使う際に注意すべき点が2つあります。
1点目は、「引数に指定する通貨記号」です。例えば、日本円の「¥」を指定する場合、環境によって文字コード(シフトJISやUTF-8など)の影響を受けることがあります。コンパイル時の環境に合わせて正しく指定してください。
2点目は、「変換できない文字が含まれている場合」です。数字、カンマ、通貨記号、小数点以外の不正な文字が文字列内に含まれていると、プログラムが異常終了(例外発生)することがあります。実務では、変換前に「文字列の中に数字以外の不要な文字が混じっていないか」をチェックするルーチンを前段に入れるのが、ベテランの安全な設計です。

便利な関数を使いこなして、読みやすく効率的なCOBOLプログラムを目指しましょう!

コメント

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