Copy from comp.lang.cobol in deja.com, not validated!
Subject: |
Re: Moving a PIC X(20) to PIC S9(8)V9(2) COMP 3 field |
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