# [Chicago-talk] detecting whether a scalar is number or a string.

Jay Strauss me at heyjay.com
Mon Jul 7 06:35:11 PDT 2008

```Hi, as Andy pointed out its in the FAQ.  Which you can do by:

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
"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
"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.

HTH
Jay
```