All pastes #386040 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-03-08 09:26 UTC
rendered paste body
Found in /usr/lib/perl5/5.8.5/pod/perlfaq4.pod
       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 "str-
       tod" and "strtol" for converting strings to double and longs, respectively.