COBOLのNUMERIC・ALPHABETICをやさしく解説!初心者でも理解できるクラス条件の使い方
生徒
「COBOLで、入力された文字が数字だけなのか、文字だけなのかを調べたいときって、どうするんですか?」
先生
「そういうときには、COBOLの『クラス条件(クラスけんじょう)』を使うんですよ。『NUMERIC』や『ALPHABETIC』がよく使われます。」
生徒
「なんだか難しそうですが、使い方は簡単なんですか?」
先生
「実はとっても簡単なんです。やさしく説明するので、順番に見ていきましょう!」
1. クラス条件(NUMERIC・ALPHABETIC)とは?
COBOL(コボル)には、変数の中に入っている値が「数字だけ」なのか「アルファベットだけ」なのかを調べる便利な機能があります。これが「クラス条件」と呼ばれるものです。
具体的には次の2つがよく使われます:
NUMERIC(ニューメリック)…数字だけで構成されているか調べる条件ALPHABETIC(アルファベティック)…英字だけで構成されているか調べる条件
この条件を使えば、たとえばユーザーが入力したデータが数字か文字かを簡単に判断できます。
2. NUMERIC(数字だけかをチェック)
NUMERICは、「そのデータが全部数字(0~9)でできているかどうか」を調べるための条件です。
たとえば、ユーザーが年齢を入力する場面で、数字以外の文字が混じっていないか確認したい場合に使います。
次のサンプルコードを見てみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. CHECK-NUMERIC.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 USER-INPUT PIC X(5).
01 RESPONSE-MESSAGE PIC X(40).
PROCEDURE DIVISION.
DISPLAY "年齢を入力してください(例:25):"
ACCEPT USER-INPUT
IF USER-INPUT IS NUMERIC
MOVE "数字だけが入力されました。" TO RESPONSE-MESSAGE
ELSE
MOVE "数字以外の文字が含まれています。" TO RESPONSE-MESSAGE
END-IF
DISPLAY RESPONSE-MESSAGE
STOP RUN.
実行結果の例:
年齢を入力してください(例:25):
25
数字だけが入力されました。
このように、IF USER-INPUT IS NUMERIC で、USER-INPUTが数字かどうかを判断できます。
3. ALPHABETIC(英字だけかをチェック)
ALPHABETICは、「英字(A~Z、a~z)だけでできているか」を調べます。数字や記号が入っていると判定されません。
たとえば、名前を入力してもらう場面で使えます。
IDENTIFICATION DIVISION.
PROGRAM-ID. CHECK-ALPHABETIC.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NAME-INPUT PIC X(10).
01 RESULT-MESSAGE PIC X(40).
PROCEDURE DIVISION.
DISPLAY "名前を入力してください(例:TARO):"
ACCEPT NAME-INPUT
IF NAME-INPUT IS ALPHABETIC
MOVE "英字だけが入力されました。" TO RESULT-MESSAGE
ELSE
MOVE "数字や記号が含まれています。" TO RESULT-MESSAGE
END-IF
DISPLAY RESULT-MESSAGE
STOP RUN.
実行結果の例:
名前を入力してください(例:TARO):
TARO
英字だけが入力されました。
ALPHABETICは、英字以外の記号や数字が混じっていると、条件に当てはまりません。
4. 注意!空白(スペース)にも気をつけよう
実は、COBOLのクラス条件は「スペース(空白)」もチェックの対象になります。
たとえば、名前に続いて空白が入っているだけでも、ALPHABETICでは「英字だけではない」と判断されてしまいます。
このような場合、入力前に余計なスペースを除去する方法(トリム処理)を使うと便利ですが、それは別の記事で紹介します。
5. クラス条件を使った簡単なバリデーション
バリデーションとは、「入力されたデータが正しいかどうかを確認する処理」のことです。
たとえば、社員コードは数字だけ、氏名は英字だけといったルールがある場合、NUMERICやALPHABETICでチェックすることで正しい入力を促すことができます。
次のように使うこともできます:
IF EMPLOYEE-CODE IS NOT NUMERIC
DISPLAY "社員コードは数字で入力してください。"
END-IF
このようにIS NOT NUMERICと書けば、「数字ではない」ことをチェックできます。
6. その他のクラス条件(参考)
今回はNUMERICとALPHABETICの基本だけを紹介しましたが、他にもCOBOLには次のようなクラス条件があります。
ALPHANUMERIC(アルファニューメリック)…英数字が混ざっていてもOKDBCS(ダブルバイト)…日本語などの全角文字が含まれるかをチェック(環境による)
これらはもう少し上級者向けの内容ですが、COBOLでは入力データの中身をしっかりと確認できるようにたくさんの機能が備わっているのです。
まとめ
COBOLのプログラムで、ユーザーから入力されたデータが「数字だけで構成されているのか」や「英字のみで構成されているのか」を判定したい場面は多くあります。そのようなときにとても便利なのが、今回学んだ「クラス条件(NUMERIC・ALPHABETIC)」です。NUMERICを使えば、年齢や社員番号などが正しく数値で入力されているかどうかを簡単にチェックできますし、ALPHABETICを使えば、名前などの英字入力の確認に使うことができます。こうしたクラス条件は、IF文と組み合わせて使うことで、入力ミスや不正なデータのチェックが自然に行えるようになり、プログラムの信頼性が格段に上がります。
また、NUMERICやALPHABETICは、単なる確認処理だけでなく、バリデーション(データの妥当性チェック)の基本としても役立ちます。入力された値が正しいかどうかを判断してから次の処理へ進む、という流れをしっかりと組み込むことが、実用的なCOBOLプログラムには欠かせません。とくに、画面入力やバッチ処理などで外部からのデータを受け取る場面では、想定外のデータが入ってくることもあるため、このようなクラス条件を活用した入力チェックは非常に重要です。
サンプルプログラム:社員情報の簡易チェック
IDENTIFICATION DIVISION.
PROGRAM-ID. CHECK-EMPLOYEE-DATA.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 EMPLOYEE-CODE PIC X(5).
01 EMPLOYEE-NAME PIC X(10).
01 RESULT-MSG PIC X(40).
PROCEDURE DIVISION.
DISPLAY "社員コードを入力してください(例:12345):"
ACCEPT EMPLOYEE-CODE
IF EMPLOYEE-CODE IS NOT NUMERIC
DISPLAY "社員コードは数字で入力してください。"
ELSE
DISPLAY "氏名を入力してください(例:TARO):"
ACCEPT EMPLOYEE-NAME
IF EMPLOYEE-NAME IS ALPHABETIC
MOVE "登録情報は問題ありません。" TO RESULT-MSG
ELSE
MOVE "氏名は英字のみで入力してください。" TO RESULT-MSG
END-IF
DISPLAY RESULT-MSG
END-IF
STOP RUN.
このように、まず社員コードがNUMERICであるかをチェックし、次に氏名がALPHABETICかを確認するという二段構えの入力チェックが実現できます。とてもシンプルな構造ですが、実際の業務でもこうした入力検証は大変重要な処理のひとつとなります。
注意点としては、ALPHABETICで判定されるのは「英字のみ」のため、スペース(空白)や記号が少しでも含まれると条件に合わなくなってしまう点です。たとえば「TARO␣(タロウ+空白)」や「TARO!」のようなデータはALPHABETICでは「英字だけではない」とされてしまいます。こうした場合には、入力値から余計な文字を取り除く「トリム処理」や「編集処理」などと組み合わせることで、より柔軟な対応が可能になります。
また、COBOLにはALPHANUMERIC(英数字)やDBCS(全角文字)といった他のクラス条件も存在し、さらに幅広いバリデーションに対応できます。たとえばパスワードの確認や、商品コードのチェック、日本語氏名の入力確認など、状況に応じた使い分けが可能です。とはいえ、まずは今回取り上げたNUMERICとALPHABETICを確実に使いこなせるようにすることで、COBOLの入力処理の基本をしっかりと身につけることができます。
初心者の方は、まず手元で簡単なIF文とNUMERIC/ALPHABETICを組み合わせたミニプログラムを作りながら、どういうときに真と判定されるのか、どんなときに偽になるのかを確認してみると良いでしょう。そして実務に近い場面で活用できるよう、習得した知識を徐々に応用していくことが大切です。
生徒
「NUMERICとALPHABETICって、最初は難しそうって思ったけど、意外とシンプルでしたね。」
先生
「そうでしょう?使い方さえ覚えてしまえば、入力の確認やチェックにとても役立つんですよ。」
生徒
「社員コードとか名前をチェックする場面で、簡単にバリデーションできるのはすごく便利ですね。」
先生
「実務では入力ミスを防ぐのが大切ですからね。事前にきちんとチェックしておけば、後からエラーで困ることも減ります。」
生徒
「でも空白や記号が入ってるだけでも引っかかるのは意外でした…。今度はスペースを除く方法も学んでみたいです。」
先生
「それは良い視点ですね。次はトリム処理や編集記号との組み合わせもやってみましょう。」