Copy from comp.lang.cobol in deja.com, not validated!

>> Thread: Moving a PIC X(20) to PIC S9(8)V9(2) COMP 3 field
>> Forum comp.lang.cobol
Subject: Re: Moving a PIC X(20) to PIC S9(8)V9(2) COMP 3 field
Date: 11/17/2000
Author: Erlend Moen <erlend.moen@disys.no>

Craig <craigstewart9999@my-deja.com> skrev i
news:8v1qpm$8vi$1@nnrp1.deja.com
>
> > I often have to import data from other sources into our accounting-
> system. I
> > have ended up with a little routine that "chews" on any given string
> and
>
> That would be greatly appreciated. my e-mail address is
 
Ok, here it is. It's two copy-files. This is a routine I have developed to handle many weird input-formats, that's why I gave up finding a singel function for this. It was not possible... hope this will help you! Btw: The variable-names are in Norwegian, I didn't bother to translate them, I tried to translate my comments however.
 
WSSTR2N.CPY:
 
      01  STR2NUM.
          03  STR2NUM-DESIMALPUNKT PIC X VALUE ".".
          03  STR2NUM-STRENG      PIC X(18).
          03  STR2NUM-NEGATIV      PIC S9.
          03  STR2NUM-DESIMAL      PIC 9.
          03  STR2NUM-TALL        PIC S9(9)V9(9).
          03  STR2NUM-NUM          PIC 9(9)V9(9).
          03  FILLER REDEFINES STR2NUM-NUM.
              05  STR2NUM-HELTALL  PIC X(9).
              05  STR2NUM-DELTALL  PIC X(9).
          03  STR2NUM-TELLER1      PIC 9(9).
          03  STR2NUM-TELLER2      PIC 9(9).
          03  STR2NUM-TELLER3      PIC 9(9).
 
 
STR2N.CPY:
 
      *STR2N.CPY
      *
      *1999-12-08 EM
      *
      *This routine converts a string to a number defined as S9(9)V9(9).       *The input-value is a string with a length of up to 18 characters. It may
      *be right- or left-justified or even centered. Decimal-point can be configured
      *and can be set in the variable STR2NUM-DESIMALPUNKT. Default is ".". It also
      *handles negative values.
      *
      *To use the routine, just set STR2NUM-DESIMALPUNKT to any desired value
      *if it differs from ".". Then, move the string into STR2NUM-STRENG and perform
      *STR2NUM. The result will be generated in STR2NUM-TALL.
      *The variables for this routine is found in WSSTR2N.CPY.
 
      STR2NUM SECTION.
      STR2NUM-001.
 
          INITIALIZE STR2NUM-NEGATIV
                      STR2NUM-DESIMAL
                      STR2NUM-NUM
                      TO STR2NUM-TALL.
 
          INSPECT STR2NUM-STRENG  TALLYING STR2NUM-DESIMAL
                                    FOR ALL STR2NUM-DESIMALPUNKT.           INSPECT STR2NUM-STRENG  TALLYING STR2NUM-NEGATIV
                                    FOR ALL "-".
 
          IF      STR2NUM-NEGATIV  > 0
                  MOVE -1          TO STR2NUM-NEGATIV
          ELSE
                  MOVE 1          TO STR2NUM-NEGATIV.
 
          IF      STR2NUM-DESIMAL  = 0
                  MOVE 18          TO STR2NUM-TELLER2
                  GO TO            STR2NUM-010.
 
      *Finding the position of the first decimal digit
          PERFORM  WITH TEST AFTER
                    VARYING STR2NUM-TELLER1 FROM 18 BY -1
                                          UNTIL STR2NUM-TELLER1 = 1                   IF  STR2NUM-STRENG(STR2NUM-TELLER1:1) =
                                                    STR2NUM-DESIMALPUNKT                         ADD 1 TO STR2NUM-TELLER1 GIVING STR2NUM-TELLER2                         MOVE 1      TO STR2NUM-TELLER1
                  END-IF
          END-PERFORM.
 
          MOVE    1                TO STR2NUM-TELLER3.
 
      *Filling decimal-part
          PERFORM WITH TEST AFTER
                  VARYING STR2NUM-TELLER1
                                        FROM STR2NUM-TELLER2 BY 1                                         UNTIL STR2NUM-TELLER1 = 18                   IF  STR2NUM-STRENG(STR2NUM-TELLER1:1) NOT < "0"                   AND  STR2NUM-STRENG(STR2NUM-TELLER1:1) NOT > "9"                         MOVE STR2NUM-STRENG(STR2NUM-TELLER1:1) TO                                     STR2NUM-DELTALL(STR2NUM-TELLER3:1)                         ADD 1      TO STR2NUM-TELLER3
                  END-IF
          END-PERFORM.
 
      *The position of the last digit in the integer
          SUBTRACT 2              FROM STR2NUM-TELLER2.
 
      STR2NUM-010.
 
          MOVE    9                TO STR2NUM-TELLER3.
 
      *Filling the integer-part
          PERFORM WITH TEST AFTER
                  VARYING STR2NUM-TELLER1 FROM STR2NUM-TELLER2 BY -1                                           UNTIL STR2NUM-TELLER1 = 1                   IF  STR2NUM-STRENG(STR2NUM-TELLER1:1) NOT < "0"                   AND  STR2NUM-STRENG(STR2NUM-TELLER1:1) NOT > "9"                         MOVE STR2NUM-STRENG(STR2NUM-TELLER1:1) TO                                     STR2NUM-HELTALL(STR2NUM-TELLER3:1)                         SUBTRACT 1  FROM STR2NUM-TELLER3
                        IF  STR2NUM-TELLER3 = 0
                            MOVE 1 TO STR2NUM-TELLER2
                        END-IF
                  END-IF
          END-PERFORM.
 
          MOVE    STR2NUM-NUM      TO STR2NUM-TALL.
          MULTIPLY STR2NUM-TALL    BY STR2NUM-NEGATIV
                                    GIVING STR2NUM-TALL.
 
      STR2NUM-900.
      STR2NUM-EXIT.
          EXIT.
 
--
Regards,
Erlend Moen
DI Systemer AS
Norway