COBOLのNUMERICクラス条件を完全ガイド!初心者でもわかる数値チェックの基本
生徒
「先生、COBOLで文字が数字かどうかを調べる方法ってありますか?」
先生
「はい、ありますよ。COBOLではNUMERICクラス条件という仕組みを使えば、簡単に数値チェックができます。」
生徒
「数値チェックって、たとえば入力が数字だけかどうかを確認することですか?」
先生
「その通りです!では、実際にNUMERICを使った数値チェックの方法を見ていきましょう。」
1. NUMERICクラス条件とは?
NUMERICクラス条件とは、COBOLで「そのデータがすべて数字(0〜9)で構成されているかどうか」を判定するための条件です。たとえば、「123」なら数字ですが、「12A」や「1-2」は数字ではありません。
この機能を使えば、ユーザーが入力した値が本当に数値かどうかを自動でチェックできます。入力ミスを防ぐのにとても便利なんです。
2. NUMERICの基本構文
構文はとても簡単で、IF 変数 IS NUMERICと書くだけです。もし変数の中身がすべて数字なら真(true)となり、そうでなければ偽(false)になります。
IF 変数名 IS NUMERIC
DISPLAY "これは数値です。"
ELSE
DISPLAY "これは数値ではありません。"
END-IF
実際の例を見てみましょう。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-INPUT PIC X(5).
PROCEDURE DIVISION.
MOVE "123" TO WS-INPUT
IF WS-INPUT IS NUMERIC
DISPLAY "数値です!"
ELSE
DISPLAY "数値ではありません!"
END-IF
STOP RUN.
数値です!
このように、"123"は数字だけなので「数値です!」と表示されます。
3. 数字以外を入れるとどうなる?
今度は、数字以外の文字を入れてみましょう。
MOVE "12A" TO WS-INPUT
IF WS-INPUT IS NUMERIC
DISPLAY "数値です!"
ELSE
DISPLAY "数値ではありません!"
END-IF
数値ではありません!
「A」が混ざっているため、COBOLはこの文字列を「数値ではない」と判断します。つまり、NUMERIC条件は非常に正確に数字チェックをしてくれるのです。
4. NUMERICが使えるデータ型に注意
NUMERICクラス条件を使えるのは、数字として扱える項目(PIC 9やPIC X)に限られます。つまり、データ項目が文字型(PIC X)でも、内容が数字であれば判定できますが、定義自体がアルファベット専用(PIC Aなど)の場合は注意が必要です。
たとえば、次のようなデータ項目があったとします。
01 WS-NUM1 PIC 9(3).
01 WS-CHAR1 PIC X(3).
WS-NUM1は数値型の変数、WS-CHAR1は文字型の変数です。どちらもNUMERICを使ってチェックできますが、判定の仕方に違いがあります。
たとえば次のように書くと、どちらも動作します。
MOVE "123" TO WS-NUM1
IF WS-NUM1 IS NUMERIC
DISPLAY "WS-NUM1は数値です。"
END-IF
MOVE "12A" TO WS-CHAR1
IF WS-CHAR1 IS NUMERIC
DISPLAY "WS-CHAR1は数値です。"
ELSE
DISPLAY "WS-CHAR1は数値ではありません。"
END-IF
WS-NUM1は数値です。
WS-CHAR1は数値ではありません。
このように、NUMERICは入力値が「本当に数字だけで構成されているか」を判定してくれます。
5. マイナスや小数点はどう判定される?
ここで注意したいのが、マイナス(−)や小数点(.)を含む場合です。実は、COBOLのNUMERICは「0〜9の数字だけ」で構成されているかを判定します。そのため、-123や12.3はNUMERICでは数値ではないと判定されます。
次の例を見てみましょう。
MOVE "-123" TO WS-INPUT
IF WS-INPUT IS NUMERIC
DISPLAY "数値です。"
ELSE
DISPLAY "数値ではありません。"
END-IF
数値ではありません。
このように、符号(−や+)や小数点を含む場合は、別の方法でチェックする必要があります。たとえば、INSPECT文やFUNCTION NUMVALを組み合わせて、より柔軟に判定する方法もありますが、まずはNUMERICで基本を押さえましょう。
6. IF文と組み合わせて安全な入力チェック
実際のプログラムでは、ユーザーが入力した値が数値かどうかを調べて、正しければ次の処理に進む、という流れがよくあります。NUMERICクラス条件は、そのような場面で非常に役立ちます。
たとえば、年齢を入力させるプログラムを考えてみましょう。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-AGE PIC X(3).
PROCEDURE DIVISION.
MOVE "25" TO WS-AGE
IF WS-AGE IS NUMERIC
DISPLAY "入力は数値です。年齢チェックを続けます。"
ELSE
DISPLAY "数値以外が入力されています。"
END-IF
STOP RUN.
入力は数値です。年齢チェックを続けます。
もしここで「2A」などを入力した場合は、「数値以外が入力されています。」と表示されます。このように、ユーザー入力を安全に扱うための第一歩として、NUMERICクラス条件は非常に重要です。
7. NOT NUMERICで逆チェックもできる
NUMERICの反対の条件として、NOT NUMERICも使えます。つまり、「数字ではない場合」に実行したい処理を書くことができます。
IF WS-INPUT IS NOT NUMERIC
DISPLAY "入力値が不正です。"
END-IF
「数字ではないときにエラーを出す」「再入力を求める」など、実際の業務システムで非常によく使われます。
8. まとめるとNUMERICは「安全なプログラム作りの基本」
NUMERICクラス条件は、COBOLで文字列が数値かどうかをチェックするためのとても重要な仕組みです。エラーを防ぎ、入力データの品質を保つための基礎的なテクニックです。
数値チェックを正しく使いこなすことで、より信頼性の高いCOBOLプログラムを作ることができます。初心者の方も、ぜひこの機能を覚えておきましょう!