Having said all that, wanting to do without
Mata seems a trifle perverse for anyone with
Stata 9:
. mata : ascii("`")
96
. mata : ascii("a")
97
Nick
[email protected]
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]]On Behalf Of Nick Cox
> Sent: 11 June 2006 16:20
> To: [email protected]
> Subject: st: RE: RE: Trying to do inverse of char(n) without Mata
> ascii()
>
>
> A second take on this can exploit a simple
> principle. While Mike's code loops over all
> the possibilities to create a composite
> "dictionary" string containing all the
> characters, almost always you need to do
> less than that. You just need to search until
> what you find what you want, and then
> stop.
>
> For example,
>
> local i = 1
> while char(`++i') != "a" {
> *
> }
> di `i'
>
> or
>
> local i = 1
> while char(`i') != "a" {
> local ++i
> }
> di `i'
>
> This doesn't work so easily
> with ` , and you wouldn't want
> to do it repeatedly, so -- without
> much checking -- here is another go.
>
> ------------------------- charfind.ado
> *! NJC 1.0.0 11 June 2006
> program charfind
> version 8.2
> if `"`0''"' == `"`=char(96)''"' {
> di as res "96"
> exit 0
> }
> else {
> local i = 1
> while char(`i') != `"`0'"' {
> local ++i
> if `i' == 256 Goerror
> }
> di as res "`i'"
> }
> end
>
> program Goerror
> di as err "invalid character"
> exit 498
> end
> -----------------------------
>
> Nick
> [email protected]
>
> > -----Original Message-----
> > From: [email protected]
> > [mailto:[email protected]]On Behalf Of Nick Cox
> > Sent: 10 June 2006 20:16
> > To: [email protected]
> > Subject: st: RE: Trying to do inverse of char(n) without
> Mata ascii()
> >
> >
> > A problem with this is likely to be that the tab
> > character maps to multiple spaces, so messing up
> > your counting.
> >
> > But in terms of your immediate question, look
> > again at
> >
> > strpos(`"`charorder'""', "a")
> >
> > The first five quotes read off (d = double, s = single, q = quote)
> > `" left compound d.q.
> > ` left s.q.
> > ' right s.q.
> > " d.q.
> > "' right compound d.q.
> > and are thus, as Stata says, not balanced.
> >
> > Nick
> > [email protected]
> >
> > Mike Lacy
> >
> > > I was trying implement a code fragment to give the number
> > of a given
> > > character, i.e., the inverse of char(n) without using the
> > Mata ascii
> > > function. (One of my reasons for doing it is that I am
> > annoyed by the
> > > idea that this is not simply an ordinary function in
> Stata.) So, I
> > > tried the following:
> > >
> > > *Construct a list of all the characters in order
> > > local charorder = ""
> > > forval i = 1/255 {
> > > local c = char(`i')
> > > if `i' ~= 96 { /* avoid the pesky open-quote */
> > > local charorder = `"`charorder'`c'"'
> > > }
> > > else { /* stick in a stand in */
> > > local charorder = `"`charorder'zzz"'
> > > }
> > > }
> > > local charorder = subinstr(`"`charorder'"', "zzz", "`",1)
> > > *
> > > di " The whole list: " `"`charorder""'
> > > * try finding something
> > > di "Letter a is found at ", strpos(`"`charorder'""', "a")
> > >
> > > While there may well be a more elegant way to get the open-quote
> > > character into a macro that also contains " and ', what I am most
> > > stuck with is the very last line, in which I tried to use
> strpos to
> > > find the position of a
> > > sample character, and the response is "too few quote," which
> > > presumably is the interpreter's complaint about
> > > `"`charorder'""' in strpos().
> > > Any suggestions here?
*
* For searches and help try:
* http://www.stata.com/support/faqs/res/findit.html
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/