Or ... as Mel reminded me ...

$a = '08';
$a=sprintf("%d", $a);

IF $a is an integer ....

IF $a is NOT an integer ....
$a=sprintf("%f", $a); #  but need to say how many decimal places you want to
see ...


-----Original Message-----
From: Curtis Poe [mailto:[EMAIL PROTECTED]]
Sent: August 06, 2001 11:31
To: CGI Beginners
Subject: Re: Regexes


--- Me <[EMAIL PROTECTED]> wrote:
> > I have the number '08' and I want to serch for the '0' and repalce
> with
> > nothing '' being left with only '8'.  I am an extreme newbie to
> regular
> > expressions.  Could some one explain to me how I would go about
> searching
> > for the 0 and replacing with nothing giving me the final string of 8?
> 
> # put string in the defaut variable
> # search the default variable for 0 and replace with nothing
> # print the default variable
> $_ = '08';
> s/0//;
> print;

Careful about that.  The original question was not very specific.  If the
variable with always be
"08", then there's no problem, but then, it's not really a variable and you
could set it by hand. 
The substitution above has a number of cases that could be problematic:

NUMBER   RESULT
008      08
10       1
100      10
0        
1.0      1.
0.1      .1

What should be the appropriate result of substitution for those?  If the
original poster meant "I
need to eliminate all leading zeros in numbers, then a substitution like
"s/^0+//" might be more
appropriate.

NUMBER   RESULT
008      8
10       10
100      100
0        
1.0      1.0
0.1      .1

However, if we're eliminating leading zeros, this means we probably need to
display them.  If so,
we usually want a "stand alone" zero to remain and at least one zero left
before a decimal point. 
That makes the regular expression more complicated.  What we need to do then
is specify *exactly*
what our requirements are and create a regular expression to match.

In this case, we need to eliminate all leading zeroes, so long as there is
more than one digit
(this protects the stand-alone zero) and so long as the zero is *not*
followed by a decimal point
(this prevents "0.1" from being changed to ".1").

Yeah, you're going to hate this, but this is why crafting a regex is more
difficult than it first
seems.  I'm adding the /x modifier to the end of the regex so that I can
embed comments.

    s/^     # The ^ binds the regex to the beginning of the string
       0+   # Find one or more zeros --
       (?!  # -- that are *not* followed by a decimal point (see below)
         \.
       )
       (    # Capture to $1
         .+ #   one or more of anything (this forces a str length > 1)
       )    # end capture
     /$1/x; # substitute above with $1

Or, in one line:

    s/^0+(?!\.)(.+)/$1/;

What it does:

We're looking for one or more zeros bound to the beginning of the string
(that's what the ^ anchor
does).  The funny looking "(?! ...  )" is called a zero-width negative
lookahead.  What this does
is say "make sure that the regex I specify (replace the ... with the regex)
is *not* following
what I previously matched".  Further, because it's "zero-width", it doesn't
actually capture the
information to the match.  What that means is that if all I cared about was
eliminating leading
zeroes that didn't have a decimal point following, I could do this:

    s/^0+(?!\.)//;

Because the decimal point isn't captured by the zero-width lookahead, it's
not substituted away.

Taking a look at the regex again:

    s/^0+(?!\.)(.+)/$1/;

Notice that we match one or more zeros (0+) and later match one or more of
anything (.+) except
newlines (the dot will not match a newline unless the /s modifier is placed
on the regex).  Since
we have two different parts of the regex where we must match one or more
characters, we are
ensuring that at least two characters get matched.  This ensures that "0"
does not become "".

Here's what my regex produces:

NUMBER   RESULT
008      8
10       10
100      100
0        0
1.0      1.0
0.1      0.1

Depending upon the actual needs, my regex might need to change or sprintf,
printf, or formats may
be considered.

Cheers,
Curtis Poe



=====
Senior Programmer
Onsite! Technology (http://www.onsitetech.com/)
"Ovid" on http://www.perlmonks.org/

__________________________________________________
Do You Yahoo!?
Make international calls for as low as $.04/minute with Yahoo! Messenger
http://phonecard.yahoo.com/

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to