我需要检测用户输入的值是否包含正数非零数字。输入字段表示产品数量,且必须大于零,并且不包含字母或非数字字符。 IOW,输入必须只包含这些字符:0123456789但当然,零本身是不可接受的。以下是我使用代码的方式:
if( $fields{'quantity'} =~ [this is where I am unsure] )
{
$errors .= "Please enter a whole number for the quantity.";
}
感谢。
答案 0 :(得分:4)
请注意,1E4
等字符串也是数字字符,因此并非每个数字都必须包含[0-9]
。
Scalar::Util
提供的looks_like_number
功能是检查变量是否为数字的正确方法。
use Scalar::Util 'looks_like_number';
if ( not looks_like_number( $fields{quantity} ) or $fields{quantity} <= 0 ) {
warn "Please enter a whole number for the quantity";
}
同样的事情更简洁:
warn "Please enter a whole number for the quantity"
unless looks_like_number( $fields{quantity} )
&& $fields{quantity} > 0;
请注意,Nan
,Inf
和Infinity
等字符串也是deemed numeric,所以您可能还想考虑除草这些字符串:
warn "Please enter a whole number for the quantity"
unless looks_like_number( $fields{quantity} )
&& $fields{quantity} !~ /Inf|NaN/i
&& $fields{quantity} > 0;
答案 1 :(得分:3)
确实没有必要在输入中允许像1E4
这样的外来物:只需让它们键入一串数字。
此外,检查输入值的真实性将清除undef
,零和空字符串,因此这将正常工作。它检查输入是否已定义,非空,非零,并且不包含非数字字符。
unless ($fields{quantity} and $fields{quantity} !~ /\D/) {
$errors .= "Please enter a whole number for the quantity.";
}
答案 2 :(得分:2)
我认为使用来自Scalar::Util的looks_like_number
作为@Zaid指出的答案更安全,但这是一个正则表达式版本:
if (not defined $fields{'quantity'}) or $fields{'quantity'} !~ /^[0-9]+$/ or $fields{'quantity'} <= 0) {
$errors .= "Please enter a whole number for the quantity.";
}