Class conditions in COBOL are tests that check whether a data item contains characters of a specific class (type). The main class conditions are IS NUMERIC (checks for digits), IS ALPHABETIC (checks for letters), and IS ALPHANUMERIC (checks for letters or digits). Class conditions are essential for data validation, input verification, and ensuring data meets expected format requirements before processing in mainframe COBOL programs.
Class conditions test the character class (type) of data:
Class conditions return true or false, allowing conditional processing based on data type.
IS NUMERIC checks if all characters in a field are numeric digits:
12345678IF data-item IS NUMERIC imperative-statement END-IF *> Or with NOT IF data-item IS NOT NUMERIC imperative-statement END-IF
123456789101112131415161718192021222324252627282930313233WORKING-STORAGE SECTION. 01 ZIP-CODE PIC X(10). 01 PHONE-NUMBER PIC X(14). 01 AMOUNT-INPUT PIC X(15). PROCEDURE DIVISION. MAIN-PARA. *> Validate ZIP code ACCEPT ZIP-CODE IF ZIP-CODE IS NUMERIC DISPLAY "Valid ZIP code: " ZIP-CODE *> Process as numeric ELSE DISPLAY "ERROR: ZIP code must be numeric" DISPLAY "Invalid value: " ZIP-CODE END-IF *> Validate phone number (digits only, no formatting) ACCEPT PHONE-NUMBER IF PHONE-NUMBER IS NUMERIC DISPLAY "Valid phone number: " PHONE-NUMBER ELSE DISPLAY "ERROR: Phone number contains non-numeric characters" END-IF *> Validate amount ACCEPT AMOUNT-INPUT IF AMOUNT-INPUT IS NOT NUMERIC DISPLAY "ERROR: Amount must be numeric" DISPLAY "Invalid amount: " AMOUNT-INPUT END-IF STOP RUN.
IS NUMERIC returns true only if every character is a digit (0-9). Spaces, letters, or special characters cause it to return false.
IS ALPHABETIC checks if all characters are letters:
12345678IF data-item IS ALPHABETIC imperative-statement END-IF *> Or with NOT IF data-item IS NOT ALPHABETIC imperative-statement END-IF
12345678910111213141516171819202122232425262728293031WORKING-STORAGE SECTION. 01 FIRST-NAME PIC X(30). 01 LAST-NAME PIC X(30). 01 STATE-CODE PIC X(2). PROCEDURE DIVISION. MAIN-PARA. *> Validate first name ACCEPT FIRST-NAME IF FIRST-NAME IS ALPHABETIC DISPLAY "Valid first name: " FIRST-NAME ELSE DISPLAY "ERROR: First name must contain only letters" DISPLAY "Invalid name: " FIRST-NAME END-IF *> Validate last name ACCEPT LAST-NAME IF LAST-NAME IS NOT ALPHABETIC DISPLAY "ERROR: Last name contains invalid characters" END-IF *> Validate state code (letters only) ACCEPT STATE-CODE IF STATE-CODE IS ALPHABETIC DISPLAY "Valid state code: " STATE-CODE ELSE DISPLAY "ERROR: State code must be letters only" END-IF STOP RUN.
IS ALPHABETIC returns true if all characters are letters (A-Z, a-z). Behavior with spaces may vary by compiler - some treat spaces as valid, others do not.
IS ALPHANUMERIC checks if all characters are letters or digits:
12345678IF data-item IS ALPHANUMERIC imperative-statement END-IF *> Or with NOT IF data-item IS NOT ALPHANUMERIC imperative-statement END-IF
12345678910111213141516171819202122232425262728293031WORKING-STORAGE SECTION. 01 CUSTOMER-ID PIC X(10). 01 PRODUCT-CODE PIC X(8). 01 ACCOUNT-NUMBER PIC X(12). PROCEDURE DIVISION. MAIN-PARA. *> Validate customer ID (letters and numbers only) ACCEPT CUSTOMER-ID IF CUSTOMER-ID IS ALPHANUMERIC DISPLAY "Valid customer ID: " CUSTOMER-ID ELSE DISPLAY "ERROR: Customer ID must be alphanumeric" DISPLAY "No special characters allowed" END-IF *> Validate product code ACCEPT PRODUCT-CODE IF PRODUCT-CODE IS NOT ALPHANUMERIC DISPLAY "ERROR: Product code contains invalid characters" END-IF *> Validate account number ACCEPT ACCOUNT-NUMBER IF ACCOUNT-NUMBER IS ALPHANUMERIC DISPLAY "Valid account number: " ACCOUNT-NUMBER ELSE DISPLAY "ERROR: Account number must be alphanumeric" END-IF STOP RUN.
IS ALPHANUMERIC returns true if all characters are either letters (A-Z, a-z) or digits (0-9). Special characters, spaces, or punctuation cause it to return false.
Class conditions can be used in various conditional statements:
123456789IF INPUT-FIELD IS NUMERIC *> Process as numeric MOVE INPUT-FIELD TO NUMERIC-FIELD PERFORM NUMERIC-PROCESSING ELSE *> Handle non-numeric input DISPLAY "ERROR: Expected numeric value" PERFORM ERROR-HANDLING END-IF
1234567891011EVALUATE TRUE WHEN INPUT-FIELD IS NUMERIC PERFORM PROCESS-NUMERIC WHEN INPUT-FIELD IS ALPHABETIC PERFORM PROCESS-TEXT WHEN INPUT-FIELD IS ALPHANUMERIC PERFORM PROCESS-CODE WHEN OTHER DISPLAY "ERROR: Invalid character type" PERFORM ERROR-HANDLING END-EVALUATE
1234567891011121314*> Multiple conditions IF ZIP-CODE IS NUMERIC AND LENGTH OF ZIP-CODE = 5 DISPLAY "Valid 5-digit ZIP code" END-IF *> Complex validation IF CUSTOMER-ID IS ALPHANUMERIC AND CUSTOMER-ID NOT = SPACES AND LENGTH OF CUSTOMER-ID >= 5 PERFORM PROCESS-CUSTOMER ELSE DISPLAY "Invalid customer ID format" END-IF
Common patterns for using class conditions in validation:
123456789ACCEPT USER-INPUT IF USER-INPUT IS NUMERIC MOVE USER-INPUT TO NUMERIC-FIELD PERFORM PROCESS-NUMERIC ELSE DISPLAY "ERROR: Numeric input required" DISPLAY "You entered: " USER-INPUT PERFORM REQUEST-INPUT-AGAIN END-IF
1234567*> Validate format before processing IF ACCOUNT-CODE IS ALPHANUMERIC AND LENGTH OF ACCOUNT-CODE = 8 PERFORM PROCESS-ACCOUNT ELSE DISPLAY "ERROR: Account code must be 8 alphanumeric characters" END-IF
1234567891011*> Route to appropriate processor based on type IF DATA-FIELD IS NUMERIC PERFORM NUMERIC-PROCESSOR ELSE IF DATA-FIELD IS ALPHABETIC PERFORM TEXT-PROCESSOR ELSE IF DATA-FIELD IS ALPHANUMERIC PERFORM CODE-PROCESSOR ELSE DISPLAY "ERROR: Invalid data type" PERFORM ERROR-HANDLER END-IF
Understanding how class conditions handle spaces:
| Condition | Field with Spaces | Description |
|---|---|---|
| IS NUMERIC | Returns FALSE | Spaces are not numeric digits, so fields with spaces fail the numeric test |
| IS ALPHABETIC | Varies by compiler | Some compilers allow spaces in alphabetic fields, others do not |
| IS ALPHANUMERIC | Returns FALSE | Spaces are not letters or digits, so fields with spaces fail the test |
For strict validation, consider trimming spaces before testing, or use additional validation logic.
Follow these best practices:
Avoid these common mistakes:
123456789*> WRONG: May fail if field has spaces IF ZIP-CODE IS NUMERIC *> Process ZIP code END-IF *> CORRECT: Trim or handle spaces IF FUNCTION TRIM(ZIP-CODE) IS NUMERIC *> Process ZIP code END-IF
1234567891011*> WRONG: No validation MOVE INPUT-FIELD TO NUMERIC-FIELD COMPUTE RESULT = NUMERIC-FIELD * 2 *> CORRECT: Validate first IF INPUT-FIELD IS NUMERIC MOVE INPUT-FIELD TO NUMERIC-FIELD COMPUTE RESULT = NUMERIC-FIELD * 2 ELSE DISPLAY "ERROR: Invalid numeric input" END-IF
12345678*> Class condition checks CHARACTERS, not data type *> A PIC X field can be numeric if it contains digits 01 NUMERIC-STRING PIC X(10) VALUE '12345'. *> This is TRUE even though field is PIC X IF NUMERIC-STRING IS NUMERIC DISPLAY "Field contains numeric characters" END-IF
Think of class conditions like sorting toys:
So class conditions are like checking what kind of characters are in your data - all numbers, all letters, or letters and numbers - before you use them!
Complete these exercises to reinforce your understanding:
Create a program that accepts user input and validates it is numeric. If valid, display the number; if invalid, display an error message with the invalid input.
Create a program that accepts a first name and last name, validates both are alphabetic, and displays appropriate error messages if validation fails.
Create a program that accepts a product code, validates it is alphanumeric and exactly 8 characters, and processes it only if valid.
Create a program that accepts input and routes to different processors based on whether the input is numeric, alphabetic, or alphanumeric. Use EVALUATE with class conditions.
Create a program that validates multiple fields: a numeric account number, an alphabetic state code, and an alphanumeric customer ID. Display specific error messages for each validation failure.
1. What does IS NUMERIC check?
2. What does IS ALPHABETIC check?
3. What does IS ALPHANUMERIC check?
4. How do you check if a field is NOT numeric?
5. What happens if a field with spaces is tested with IS NUMERIC?
6. What is a primary use of class conditions?