Date: Fri, 16 Aug 1996 08:25:17 EDT
Sender: "SAS(r) Discussion" <SAS-L@UGA.CC.UGA.EDU>
From: Mike Rhoads <rhoadsm1@WESTATPO.WESTAT.COM>
Subject: Re: CORRECTION: reading dollar amounts with SAS
[OK -- small correction to my original posting, in case anyone winds up
searching in vain for the mythical "DOLLAR" informat. What I REALLY meant
was the COMMA informat, which among its many virtues removes dollar signs
from input data fields. I guess there's a reason to try things out before
posting them ...]
It was interesting to read Pete Lund's solution to Bill Kossack's question
about reading values such as 0000-$10.09 and 00$12345.43 in SAS. (Pete's
solution and Bill's original question are included at the end.) I had been
thinking of a different approach: after reading the field as character, use a
DO-loop to replace all of the leading zeroes with blanks, and then use the INPUT
function with the COMMA informat. I appreciate Pete's ingenious alternative,
and since it's at least as good as mine I felt relieved of the obligation to
actually implement my idea in code.
One final thought: we really should find the "someone" who created these
atrocities, and stop him (or her) before s/he strikes again!!! (wink)
*** Pete Lund's response and Bill Kossack's original question ***
input dollars $12.;
NewBucks = input(compress(dollars,'$-'),12.2) *
(((indexc(dollars,'-') gt 0) * -2) + 1);
put dollars= NewBucks=;
Read in the dollar values as character. The statement to convert the
dollars to numeric does the following:
- COMPRESSes out the $ and the - sign and puts the number into a numeric
format - this will get rid of the leading zeros
- checks to see if there's a - sign (INDEXC will return a zero if not or
the position of the - in the string), here's the logic:
-> INDEXC(dollars,'-') gt 0 returns 0 if no '-', 1 if found
-> multiply by -2 still gives 0 if not found, -2 if found
-> add 1 gives 1 if not found, -1 if found
- we can multiply the numeric portion of the dollar amount by this number
to get a negative if there was a '-' in the number and a positive if not
You could also do the first part of the expression:
NewBucks = input(compress(dollars,'$_'),12.2);
if indexc(dollars,'-') gt 0 then NewBucks = NewBucks * -1;
But where's the fun in that?!?
WA State Office of Financial Management
From: Bill Kossack
Subject: reading dollar amounts with SAS
Date: Thursday, August 15, 1996 2:39PM
Someone has created a file containing a field with an amount of money.
The problem with reading the field is that they have written the field in
the following format.
That is, the dollar amount has leading zeros with a sign if negative
and a dollar sign and a decimal and the cents.
The number of dollars can range from none to a large number. This results
in the sign being in any possible location and the dollar sign following.
The kicker is the leading zeros.
How do I read this with SAS?
William S. Kossack