Hallo tere,
perldoc -q number:
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 "Infin-
ity", 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 (/[1]?\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)?$/)
{ 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 "Reg-
exp::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" func-
tion. 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.
Grüße,
CK
+- ↩︎