Checking for incompatible data (numeric class test)

The compiler assumes that values you supply for a data item are valid for the PICTURE and USAGE clauses, and does not check their validity. Ensure that the contents of a data item conform to the PICTURE and USAGE clauses before using the item in additional processing.

About this task

It can happen that values are passed into your program and assigned to items that have incompatible data descriptions for those values. For example, nonnumeric data might be moved or passed into a field that is defined as numeric, or a signed number might be passed into a field that is defined as unsigned. In either case, the receiving fields contain invalid data. When you give an item a value that is incompatible with its data description, references to that item in the PROCEDURE DIVISION are undefined and your results are unpredictable.

You can use the numeric class test to perform data validation. For example:


Linkage Section.
01  Count-x   Pic 999.
. . .
Procedure Division Using Count-x.
    If Count-x is numeric then display "Data is good"
The numeric class test checks the contents of a data item against a set of values that are valid for the PICTURE and USAGE of the data item. For example, a packed decimal item is checked for hexadecimal values X'0' through X'9' in the digit positions and for a valid sign value in the sign position (whether separate or nonseparate). An external decimal data item that has USAGE DISPLAY is checked for hexadecimal values X'0' through X'9' in the digit positions (the lower 4 bits of each byte), for a valid zone code in the upper 4 bits of each byte and for a valid sign value in the sign position (whether separate or nonseparate). The sign code is in the upper 4 bits of the sign byte or in a separate byte if SIGN IS SEPARATE was specified. If the SIGN IS SEPARATE clause is used, the upper four bits of all bytes must be x'F'.
Note: Although the INVDATA compiler option allows toleration of invalid zone codes in USAGE DISPLAY numeric (zoned decimal) data items in numeric comparisons, invalid zone codes in zoned decimal data items will be treated as nonnumeric by the numeric class test.

For zoned decimal and packed decimal items, the numeric class test is affected by the NUMPROC compiler option and the NUMCLS option (which is set at installation time). To determine the NUMCLS setting used at your installation, consult your system programmer.

If NUMCLS(PRIM) is in effect at your installation, use the following table to find the values that the compiler considers valid for the sign.

Table 1. NUMCLS(PRIM) and valid signs
  NUMPROC(NOPFD) NUMPROC(PFD)
Signed C, D, F C, D, +0 (positive zero)  
Unsigned F F
Separate sign +, - +, -, +0 (positive zero)  

If NUMCLS(ALT) is in effect at your installation, use the following table to find the values that the compiler considers valid for the sign.

Table 2. NUMCLS(ALT) and valid signs
  NUMPROC(NOPFD) NUMPROC(PFD)
Signed A to F C, D, +0 (positive zero)  
Unsigned F F
Separate sign +, - +, -, +0 (positive zero)  

For more information about numeric class condition, see Class condition in the Enterprise COBOL for z/OS® Language Reference.

You can also use the NUMCHECK(ZON,PAC) option to have the compiler generate implicit numeric class tests for zoned decimal (numeric USAGE DISPLAY) and packed decimal (COMP-3) data items that are used as sending data items. This numeric class test validates data and also validates sign fields against the NUMPROC compiler option to help you decide whether you can use NUMPROC(PFD) or not. For details, see NUMCHECK.

For more information about other invalid data issues, in particular for COBOL migration purposes, see the FAQ about invalid data in the Enterprise COBOL Migration Guide.

Related references  
NUMCHECK
NUMPROC
INVDATA