for my $input (qw<
+4
1.0
1e5
12345678901234567890
1.234567890123456789
>) {
if( $input+0 eq $input ) {
print "$input is a number!\n";
} else {
print "$input is not ", 0+$input, "\n";
}
}
__END__
+4 is not 4
1.0 is not 1
1e5 is not 100000
12345678901234567890 is not 1.23456789012346e+019
1.234567890123456789 is not 1.23456789012346
Update: It successfully detects if $input is (primarily) holding a numeric value (an IV or NV, how Perl stores an integer and floating point, respectively) or is holding a string value that equals the canonical string representation of any possible Perl numeric value.
So I don't believe that there are any false positives. The false negatives are the many ways to reasonably represent a numeric value that aren't Perl's canonical representation.
|