gnucobol-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[open-cobol-list] editing numeric data from alphanumeric strings


From: Michael
Subject: [open-cobol-list] editing numeric data from alphanumeric strings
Date: Thu, 08 Jan 2009 10:58:14 -0600
User-agent: Thunderbird 2.0.0.19 (Windows/20081209)

A while back, can't recall who, but someone on the OC list posted a question related to getting numeric data from character string user I/O or database.....

This my favorite method, mostly because it is COBOL, and it doesn't depend on an external user interface to edit the user input, and it doesn't depend on the data in a data file being good data. You edit directly in the COBOL code, and then branch to what ever error condition section you want. Unmodified for HP COBOLII/iX ansi85 compiler, but should compile clean using OC. With the exception of the $CONTROL statements, and pay attention to the indianess (COMP/COMP-5).

$TITLE "NUMGET - SUBROUTINE TO GET NUMBER FROM CHARACTER BUFFER"
$CONTROL RLFILE,LIST,DYNAMIC,BOUNDS,POST85
IDENTIFICATION DIVISION.
PROGRAM-ID. NUMGET.
DATE-COMPILED.

**************************************************************
*                                                            *
*  THIS SUBROUTINE CONVERTS THE NUMBERS AS ENTERED AT THE    *
*  TERMINAL INTO NUMERIC, SIGNED NUMBERS THAT CAN BE USED    *
*  IN THE PROGRAM.                                           *
*                                                            *
*  PARAMETERS:                                               *
*                                                            *
*  NUM-1     A 14 CHARACTER FIELD CONTAINING THE NUMBER AS   *
*            THE OPERATOR TYPED IT.                          *
*                                                            *
*  NUM-2     THE 14 ASCII DIGIT SIGNED NUMERIC VALUE OF NUM-1*
*            THAT IS RETURNED.                               *
*                                                            *
*  N-DEC     AN INTEGER WHICH RETURNS THE NUMBER OF DECIMAL  *
*            PLACES FOUND IN THE NUMBER.                     *
*                                                            *
*  N-ERR     AN INTEGER WHICH RETURNS A 1 IF NUM-1 DID NOT   *
*            CONTAIN VALID NUMERIC INFORMATION OR RETURNS 0  *
*            IF A GOOD NUMBER WAS FOUND.                     *
*                                                            *
**************************************************************

ENVIRONMENT DIVISION.

CONFIGURATION SECTION.
SOURCE-COMPUTER. HP3000.
OBJECT-COMPUTER. HP3000.
DATA DIVISION.
WORKING-STORAGE SECTION.

01  N                     PIC 9(4) COMP.
01  N1                    PIC 9(4) COMP.
01  N2                    PIC 9(4) COMP.
01  DECIMAL-SW            PIC X.
01  COMMA-SW              PIC X.
01  MINUS-SW              PIC X.

LINKAGE SECTION.

01  NUM-1.
    02  X1                PIC X  OCCURS 14 TIMES.

01  NUM-2.
    02  X2                PIC X  OCCURS 14 TIMES.
01  FILLER REDEFINES NUM-2.
    02  NUM-2N            PIC S9(14).

01  N-DEC                 PIC 9(4) COMP.
01  N-ERR                 PIC 9(4) COMP.
$PAGE
PROCEDURE DIVISION USING NUM-1 NUM-2 N-DEC N-ERR.

START-HERE.
    MOVE SPACES TO NUM-2.
    MOVE ZERO TO N-DEC N-ERR.
    MOVE 14 TO N.

1ST-LOOP.
    IF N NOT = ZERO
        IF X1 (N) = SPACE
            SUBTRACT 1 FROM N
            GO TO 1ST-LOOP.
    COMPUTE N1 = N + 1.
    MOVE 14 TO N2.
    MOVE "0" TO DECIMAL-SW COMMA-SW MINUS-SW.

2ND-LOOP.
    SUBTRACT 1 FROM N1.
    IF N1 = ZERO GO TO FINISH-UP.
    IF X1 (N1) = SPACE GO TO 2ND-LOOP.
    IF X1 (N1) = "-"
        IF MINUS-SW = "1"
            MOVE "1" TO N-ERR
            GO TO 2ND-LOOP
        ELSE
            MOVE "1" TO MINUS-SW
            GO TO 2ND-LOOP.
    IF X1 (N1) = ","
        MOVE "1" TO COMMA-SW
        GO TO 2ND-LOOP.
    IF X1 (N1) = "."
        IF DECIMAL-SW = "1" OR COMMA-SW = "1"
            MOVE 1 TO N-ERR
            GO TO 2ND-LOOP
        ELSE
            MOVE "1" TO DECIMAL-SW
            GO TO 2ND-LOOP.
    IF X1 (N1) LESS THAN "0" OR GREATER THAN "9"
        MOVE 1 TO N-ERR
        GO TO 2ND-LOOP.
    MOVE X1 (N1) TO X2 (N2).
    IF DECIMAL-SW NOT = "1" ADD 1 TO N-DEC.
    SUBTRACT 1 FROM N2.
    GO TO 2ND-LOOP.

FINISH-UP.
    INSPECT NUM-2 REPLACING LEADING SPACES BY "0".
    IF MINUS-SW = "1" COMPUTE NUM-2N = - NUM-2N.
    IF DECIMAL-SW = "0" MOVE ZERO TO N-DEC.
    IF N-ERR NOT = ZERO MOVE ZERO TO NUM-2N N-DEC.

ALL-DONE.
    EXIT PROGRAM.
END PROGRAM NUMGET.

EXAMPLE:

Move Mychar-string to NUM-1.
Initialize NUM-2 N-DEC N-ERR.
CALL "NUMGET" USING NUM-1 NUM-2 N-DEC N-ERR.
IF N-ERR NOT = 0 GO TO ERROR-SECTION.


--
Michael Anderson,
J3k Solutions
Sr.Systems Programmer/Analyst
832.515.3868



reply via email to

[Prev in Thread] Current Thread [Next in Thread]