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

Reply via email to