gnucobol-users
[Top][All Lists]
Advanced

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

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


From: Bill Klein
Subject: Re: [open-cobol-list] editing numeric data from alphanumeric strings
Date: Thu, 8 Jan 2009 16:02:17 -0600

I haven't' followed all your logic, but can you tell me what your program
does that 
  FUNCTION NumVal-C
doesn't do?  (Especially if used in conjunction with TEST-NumVal-C)

It would seem to me that using the "native" COBOL language syntax to do this
is usually the best way to go.

In fact, ever since the '85 Standard, if you input actually comes in - in a
way that matches the PICTURE clause of a numeric-edited item, you can simply
MOVE it to a numeric receiving item to "de-edit" it.  I know that with real
user input, this often doesn't happen as "leading spaces" are too often
"typed in" as trailing spaces, causing a "mis-match" between user input and
program PICTURE clause. 

> -----Original Message-----
> From: Michael [mailto:address@hidden 
> Sent: Thursday, January 08, 2009 10:58 AM
> To: address@hidden
> Subject: [open-cobol-list] editing numeric data from 
> alphanumeric strings
> 
> 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
> 
> 
> --------------------------------------------------------------
> ----------------
> Check out the new SourceForge.net Marketplace.
> It is the best place to buy or sell services for
> just about anything Open Source.
> http://p.sf.net/sfu/Xq1LFB
> _______________________________________________
> open-cobol-list mailing list
> address@hidden
> https://lists.sourceforge.net/lists/listinfo/open-cobol-list
> 



reply via email to

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