I think that both the Cookbook and vroom miss some valid numbers. Here's my proposed checker. HOpe I don't get wrong ones, instead :)
Roberto
#!/usr/bin/perl
# check for numbers with punctuation
use strict;
# examples for "common-written" numbers
foreach my $var (
'','foo 30','.20','20.',',20','20,','1.3E2', '2..3','++3','2.3.',
,'..3', 0,100,'100.23','1,100.23','-3E-2'
) {
print "String: $var\n";
if (IsANumber($var)) {
print "vroom says True, ";
} else {
print "vroom says False, ";
}
if (IsANumberCookbook($var)) {
print "Cookbook says True, ";
} else {
print "Cookbook says False, ";
}
if (IsANumberMine($var)) {
my $out = $var * $var;
print "I say True and square is $out\n\n";
} else {
print "I say False\n\n";
}
}
sub IsANumber {
# vroom version
my $var = $_[0];
if (
# contains digits,commas and 1 period
($var =~ /(^[0-9]{1,}?$)|(\,*?)|(\.{1})/) &&
# does not contain alpha's, more than 1 period
# commas or periods at the beggining and ends of
# each line
!($var =~ /([a-zA-Z])|(^[\.\,]|[\.\,]$)/) &&
# is not null
($var ne '')
) { return(1) }
else { return(0) }
}
sub IsANumberCookbook {
# Perl Cookbook version
my $var = $_[0];
if (
$var =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d)?([Ee]([+-]?\d+)
+)?$/
) { return(1) }
else { return(0) }
}
sub IsANumberMine {
# my version
my $var = $_[0];
if (
$var =~ /^([+-]?)(\d+\.|\.\d+|\d+)\d*([Ee]([+-]?\d+))
+?$/
) { return(1) }
else { return(0) }
}
|