use strict; use warnings; my $precision = 4; my $scale = 3; my $regex = qr{\A(\d*?)\.?(\d*?)\z}; foreach my $float ("1", ".45", "3.452", "3.4526", "12.3", ".34567", "NaN") { if (my ($predec,$postdec) = ($float =~ m/$regex/)) { if (length "$postdec" > $scale) { print "Invalid scale in $float ($predec\t$postdec)\n"; } elsif (length "$predec" > $precision - $scale) { print "Invalid precision in $float ($predec\t$postdec)\n"; } else { print "Valid number: $float ($predec\t$postdec)\n"; } } else { print "Invalid floating point number: $float\n"; } }