This didn't work, Jim - data type mismatch.&CHAR has to be a string
representation of a number, not a hex value.
But something close can be done with %BIN. This becomes the same problem as
displaying the hex-equivalent of a string, which has been solved before.
Don't know if my solution is the same.
Negative numbers are not covered here - need to check for value of last
nybble of last byte. And number of decimals needs to be known ahead of time.
===========================================================
PGM
/* */
/* --------- Define program file(s) and variable(s). --------------- */
/* */
DCL VAR(&CHAR) TYPE(*CHAR) LEN(8) +
VALUE(X'123456789012345F')
/*---------this is your incoming */
DCL VAR(&NUM155) TYPE(*DEC) LEN(15 5)
DCL VAR(&NUMBER) TYPE(*CHAR) LEN(17)
DCL VAR(&COUNTER1) TYPE(*DEC) LEN(3 0) VALUE(1)
DCL VAR(&COUNTER2) TYPE(*DEC) LEN(3 0) VALUE(1)
DCL VAR(&BYTES2) TYPE(*CHAR) LEN(2) VALUE(X'0000')
DCL VAR(&CHAR1) TYPE(*CHAR) LEN(1)
DCL VAR(&DEC1) TYPE(*DEC) LEN(1 0)
DCL VAR(&DEC3) TYPE(*DEC) LEN(3 0)
/* */
/* --------- Change character value to a 15,5 and then to 7,2 ------ */
/* */
LOOP1:
/* Binary value of packed byte */
CHGVAR VAR(%SST(&BYTES2 2 1)) VALUE(%SST(&CHAR +
&COUNTER1 1))
CHGVAR VAR(&DEC3) VALUE(%BIN(&BYTES2))
/* 1st digit */
CHGVAR VAR(&DEC1) VALUE(&DEC3 / 16)
CHGVAR VAR(&CHAR1) VALUE(&DEC1)
CHGVAR VAR(%SST(&NUMBER &COUNTER2 1)) VALUE(&CHAR1)
CHGVAR VAR(&COUNTER2) VALUE(&COUNTER2 + 1)
/* 2nd digit */
IF COND(&COUNTER2 < 16) THEN(DO)
CHGVAR VAR(&DEC1) VALUE(&DEC3 - (&DEC1 * 16))
CHGVAR VAR(&CHAR1) VALUE(&DEC1)
CHGVAR VAR(%SST(&NUMBER &COUNTER2 1)) VALUE(&CHAR1)
ENDDO
CHGVAR VAR(&COUNTER1) VALUE(&COUNTER1 + 1)
IF COND(&COUNTER1 <= 8) THEN(DO)
CHGVAR VAR(&COUNTER2) VALUE(&COUNTER2 + 1)
GOTO CMDLBL(LOOP1)
ENDDO
CHGVAR VAR(&NUMBER) VALUE(' ' *CAT %SST(&NUMBER 1 +
10) *CAT '.' *CAT %SST(&NUMBER 11 5))
CHGVAR VAR(&NUM155) VALUE(&NUMBER)
ENDPGM
======================================================
If you debug this and set a breakpoint at the last statement, &NUM155 will
be 1234567890.12345
Vern
At 01:30 PM 2/3/2003 -0600, you wrote:
Bill,
You can try this in your CL, I believe it will work.....unless I am not
understanding what you are trying to do.
/* */
/* --------- Define program file(s) and variable(s). --------------- */
/* */
DCL VAR(&CHAR ) TYPE(*CHAR) LEN( 11)
<----------this is your incoming
DCL VAR(&NUM155 ) TYPE(*DEC ) LEN(15 5)
DCL VAR(&NUMBER ) TYPE(*DEC ) LEN( 7 2)
/* */
/* --------- Change character value to a 15,5 and then to 7,2 ------ */
/* */
CHGVAR VAR(&NUM155 ) VALUE(&CHAR )
CHGVAR VAR(&NUMBER ) VALUE(&NUM155)
Jim
-----Original Message-----
From: bill.reger@convergys.com [mailto:bill.reger@convergys.com]
Sent: Monday, February 03, 2003 12:18 PM
To: Midrange-L@midrange.com
Subject: Packed (*CHAR) to Numeric (*DEC) in CLP
Can anyone tell me how (in a CLP) to convert a *CHAR declared variable
containing a packed numeric value into a *DEC declared variable?
Bill
As an Amazon Associate we earn from qualifying purchases.