How Do I De-Edit? Let Me Count The Ways
July 30, 2014 Ted Holt
I’m sure that you, the professional that you are, are expert in the process of editing numbers. Unlike me, you may even have memorized the edit codes we often use in RPG and DDS source code. Editing is important because it makes life easier for the folks who use the software we produce. But do you know how to de-edit?
These days data comes from many sources, and the people who send us this data (or from whom we glean it) don’t always give it to us in tidy packages. Converting such data to a usable format can be challenging, but of course, that’s no big deal for you, the professional that you are, because just as you’ve mastered editing, you’ve also mastered de-editing.
De-editing means removing editing characters from a numeric string in order to extract the value. This means removing such things as currency symbols, thousands separators, negative number indicators, slashes, and hyphens.
Let’s consider an example. Our RPG program has just read some text received from a Web service:
You owe us $7,295,138.64. Pay now or else!
How do we convert this dollar amount into something usable?
The first thing we’d need to do is to extract the dollar amount. Since I am a big proponent of solving a problem once and re-using the solution, I would start by writing an RPG subprocedure to isolate the dollar amount.
P ExtractDollars... P b D pi 24a varying D inText 256a const // locals D FromPos s 5u 0 D ToPos s 5u 0 D WorkString s 24a /free monitor; FromPos = %scan ('$' : inText); if FromPos <= *zero; return *blanks; endif; ToPos = %scan ('. ': inText: FromPos); if ToPos < FromPos; ToPos = %scan (' ': inText: FromPos); endif; if ToPos > FromPos; return %subst(inText: FromPos: ToPos - FromPos); endif; on-error; // do nothing endmon; return *blanks; /end-free P e
This routine extracts the character string $7,295,138.64 from the text. Now it’s de-editing time. As before, solve the problem once and re-use the solution.
P DeEditDollars b D pi 24a varying D inText 24a varying const // locals D WorkVar s 24a varying D WorkVarLen s 5u 0 /free WorkVar = %scanrpl('$': '': %trimr(inText)); WorkVar = %scanrpl(',': '': WorkVar); // remove trailing - or CR WorkVarLen = %len(WorkVar); select; when WorkVarLen > 1 and %subst(WorkVar: WorkVarLen: 1) = '-'; WorkVar = '-' + %subst(WorkVar:1: WorkVarLen-1); when %len(WorkVar) > 2 and %subst(WorkVar: WorkVarLen-1: 2) = 'CR'; WorkVar = '-' + %subst(WorkVar:1: WorkVarLen-2); endsl; return WorkVar; /end-free P e
Now put it all together.
D Text s 80a D Amount s 11p 2 Amount = %dec(DeEditDollars(ExtractDollars(Text)):11:2);
Voilá! The AMOUNT variable has the dollar value in a usable numeric format.
COBOL programmers may find this process a bit easier. Under the 1985 standard, de-editing takes place when copying from an edited variable to an unedited variable.
01 Edited-var pic zz,zzz.99cr. 01 Balance-due pic s9(5)v99. Move Edited-var to Balance-due
I am annoyed when I use a credit card to pay for something via the Web and see tiny text demanding that I not leave spaces in the credit card number. What kind of a sorry, no-count programmer is it that can’t remove spaces from a character string?
De-editing is important.