|
Hans, I do remember Dick Bains complaining when they implemented XLATE in RPGIII as to how poorly it performed. So %SCAN over and over again would be faster? Hmmm, maybe going further and using memchr() would even be better? -Bob -----Original Message----- From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-bounces@xxxxxxxxxxxx] On Behalf Of Hans Boldt Sent: Tuesday, June 01, 2004 10:04 AM To: rpg400-l@xxxxxxxxxxxx Subject: Re: trimming non-numerics Bob Cozzi wrote: > Hans, > Actually I like a combination of yours and mine best. > Mine allows you to specify a list of extra characters that you want to save > (such as the decimal notation, minus sign, whatever). But yours, I think, > would compress out the garbage more efficiently since I do use the > %SCAN/%REPLACE method in mine. > Here's the hybrid version of that routine from the article: > > P CleanNum B Export > > D CleanNum PI 256A Varying > D szInValue 256A Const Varying > > D szKeepMe 10A Const Varying OPTIONS(*NOPASS) > > D Garbage S Like(szInValue) Inz > D CleanVal S Like(szInValue) Inz > D CleanDigits S Like(szInValue) Inz > D SaveMe S Like(szInValue) Inz > D Blanks S Like(szInValue) Inz > > D SAVEVal C Const('0123456789') > D SAVEEx S 10A Inz('.-') Varying > D i S 10I 0 > > ** If the caller passed in different symbols, > ** use those instead of the default minus and period. > C if %Parms >= 2 > C eval SaveEx = szKeepMe > C endif > > C eval SaveMe = SaveVal + SaveEx > > C eval %len(Blanks) = %len(SaveMe) > ** Isolate the digits and anything else the caller specified. > C SaveMe:Blanks XLATE szInValue Garbage > > C eval %len(Blanks) = %len(Garbage) > ** Translate all of the garbage characters to blanks. > C Garbage:BlanksXLate szInValue CleanVal > > ** Now compress out the blanks from the value. > C for i = 1 to %Len(CleanVal) > C if %subst(CleanVal:I:1) <> ' ' > C eval CleanDigits = CleanDigits + > C %subst(CleanVal:I:1) > C endif > C endfor > ** Return the clean number to the caller, as text. > C return CleanDigits > P CleanNum E > > Hmmm, you're rather fond of XLATE, eh? With the extra functionality of specifying additional characters to filter out, considering the overhead involved with XLATE, I think I'd still go with something a bit simpler: -------------------------------------------------- ... SaveMe = SaveVal + SaveEx; // Keep only the specified characters for i = 1 to %len(CleanVal); ch = %subst(CleanVal:i:1); if %scan(ch:SaveMe) > 0: CleanDigits += ch; endif; endfor; return CleanDigits; ... -------------------------------------------------- Cheers! Hans -- This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing list To post a message email: RPG400-L@xxxxxxxxxxxx To subscribe, unsubscribe, or change list options, visit: http://lists.midrange.com/mailman/listinfo/rpg400-l or email: RPG400-L-request@xxxxxxxxxxxx Before posting, please take a moment to review the archives at http://archive.midrange.com/rpg400-l.
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 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.