Paul Rogers wrote:
> I have a function which does numeric testing. It's worked pretty well. As
> you can see, I also made a notation to myself when I was constructing it
> that I may wish to change it to simply using Scalar::Util. I can't remember
> why I opted not to use it (maybe I was just lazy ;-).
There's always info in the man pages too:
perlfaq4:
How do I determine whether a scalar is a number/whole/integer/float?
Assuming that you don't care about IEEE notations like "NaN" or "Infinity",
you probably just want to use a regular expression.
if (/\D/) { print "has nondigits\n" }
if (/^\d+$/) { print "is a whole number\n" }
if (/^-?\d+$/) { print "is an integer\n" }
if (/^[+-]?\d+$/) { print "is a +/- integer\n" }
if (/^-?\d+\.?\d*$/) { print "is a real number\n" }
if (/^-?(?:\d+(?:\.\d*)?|\.\d+)$/) { print "is a decimal number\n" }
if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
{ print "a C float\n" }
There are also some commonly used modules for the task. Scalar::Util
(distributed with 5.8) provides access to perl's internal function
"looks_like_number" for determining whether a variable looks like a number.
Data::Types exports functions that validate data types using both the above
and other regular expressions. Thirdly, there is "Regexp::Common" which has
regular expressions to match various types of numbers. Those three modules
are available from the CPAN.
If you're on a POSIX system, Perl supports the "POSIX::strtod" function. Its
semantics are somewhat cumbersome, so here's a "getnum" wrapper function for
more convenient access. This function takes a string and returns the number
it found, or "undef" for input that isn't a C float. The "is_numeric"
function is a front end to "getnum" if you just want to say, ``Is this a
float?''
sub getnum {
use POSIX qw(strtod);
my $str = shift;
$str =~ s/^\s+//;
$str =~ s/\s+$//;
$! = 0;
my($num, $unparsed) = strtod($str);
if (($str eq '') || ($unparsed != 0) || $!) {
return undef;
} else {
return $num;
}
}
sub is_numeric { defined getnum($_[0]) }
Or you could check out the String::Scanf module on the CPAN instead. The
POSIX module (part of the standard Perl distribution) provides the "strtod"
and "strtol" for converting strings to double and longs, respectively.
> sub IsNumeric {
>
> # Input Variable: [EXPR to be evaluated]
> # Return: Defined if numeric
>
> $input = $_[0];
>
> if ( $input =~ /^\-?(\d+\.?\d*|\.\d+)$/ ) {
> return 1;
> } else {
> return;
> }
>
> # NOTE: at some point, may wish to substitute with...
> # use Scalar::Util qw(looks_like_number);
> # print "Number" if looks_like_number($number);
>
> }
--
,-/- __ _ _ $Bill Luebkert Mailto:[EMAIL PROTECTED]
(_/ / ) // // DBE Collectibles Mailto:[EMAIL PROTECTED]
/ ) /--< o // // Castle of Medieval Myth & Magic http://www.todbe.com/
-/-' /___/_<_</_</_ http://dbecoll.tripod.com/ (My Perl/Lakers stuff)
_______________________________________________
Perl-Win32-Users mailing list
[email protected]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs