|
Hi Griz,
Try this:
**********************************************************************
P EditN B
**********************************************************************
D EditN pi
D cn 5i 0 const
D Precision 3i 0 const options(*nopass)
D Scale 3i 0 const options(*nopass)
D NumType 10 const options(*nopass)
D dataIn * value options(*nopass)
D dataOut * value options(*nopass)
D QECCVTEC pr extpgm('QECCVTEC')
D EditMask 256a
D EditMaskL 10i 0
D RcvrVarL 10i 0
D ZeroBalF 1a const
D EditCode 1a const
D FillCode 1a const
D pPrecision 10i 0 const
D pScale 10i 0 const
D Apierror 120 options(*varsize)
D QECEDT pr extpgm('QECEDT')
D RcvrVar 256a
D RcvrVarL 10i 0 const
D SrcVar 25a const
D SrcVarC 10a const
D pPrecision 10i 0 const
D EditMask 256a const
D EditMaskL 10i 0 const
D FillCode 1a const
D Apierror 120a options(*varsize)
D EditCode s 1a
D FillCode s 1a
D EditMask s 256a
D EditMaskL s 10i 0
D RcvrVar s 256a based(dataOut)
D RcvrVarL s 10i 0
D SrcVar s 25a based(dataIn)
D SrcVarC s 10a
D ZeroBalF s 1a
D EditMaskS s 48a dim(1000) static
D EditMaskSL s 10i 0 dim(1000) static
D RcvrVarSL s 10i 0 dim(1000) static
D Initialized s n
**********************************************************************
/free
// Initialize edit words...
if cn = 0;
EditMaskS = *blank;
EditMaskSL = *zeros;
RcvrVarSL = *zeros;
return;
endif;
// Prepare/retrieve edit mask...
if EditMaskS(cn) = ' ';
if Scale = 2;
EditCode = 'N';
else;
EditCode = 'Q';
endif;
QECCVTEC (EditMask:EditMaskL:RcvrVarL:ZeroBalF:EditCode:' ':
QECCVTEC (EditMask:EditMaskL:RcvrVarL:ZeroBalF:EditCode:' ':
Precision:Scale:ApiError);
EditMaskS(cn) = %subst(EditMask:1:EditMaskL);
EditMaskSL(cn) = EditMaskL;
RcvrVarSL(cn) = RcvrVarL;
endif;
// Edit number...
EditMask = EditMaskS(cn);
EditMaskL = EditMaskSL(cn);
RcvrVarL = RcvrVarSL(cn);
QECEDT (RcvrVar:RcvrVarL:SrcVar:NumType:Precision:
EditMask:EditMaskL:' ':ApiError);
return;
/end-free
**********************************************************************
p EditN E
**********************************************************************
You can call it lik so:
Packed...
EditN(cn:Precision:Scale:'*PACKED':dataIn:dataOut);
Zoned...
EditN(cn:Precision:Scale:'*ZONED':dataIn:dataOut);
Binary...
EditN(cn:Precision:Scale:'*BINARY':dataIn:dataOut);
You just need to provide the numeric edit code (you can just start at 1 and
increment for each call), the precision, the scale, and two pointers (in for
your number, out for your character).
You can always re-engineer it to only have a sinlge return if it offends. :-)
Cheers Larry DucieP.S. this was originally used by Beppe Costagliola in SQL2XML, but I use it a lot.
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.