我需要检查表单输入值是否为正整数(而不仅仅是整数),我注意到使用下面代码的另一个代码段:
$i = $user_input_value;
if (!is_numeric($i) || $i < 1 || $i != round($i)) {
return TRUE;
}
我想知道使用上面的三项检查是否有任何好处,而不仅仅是这样做:
$i = $user_input_value;
if (!is_int($i) && $i < 1) {
return TRUE;
}
答案 0 :(得分:33)
不确定为什么没有建议在此使用filter_var。我知道这是一个老线程,但也许它会帮助某人(毕竟,我最终来到这里,对吗?)。
$filter_options = array(
'options' => array( 'min_range' => 0)
);
if( filter_var( $i, FILTER_VALIDATE_INT, $filter_options ) !== FALSE) {
...
}
您也可以添加最大值。
$filter_options = array(
'options' => array( 'min_range' => 0,
'max_range' => 100 )
);
答案 1 :(得分:32)
两个代码段之间的区别在于,如果$ i是数字字符串,is_numeric($i)
也会返回true,但如果$ i是整数,则is_int($i)
仅返回true而不是$ i是整数字符串。这就是为什么你应该使用第一个代码片段,如果你想要返回true,如果$ i是整数字符串(例如,如果$ i ==“19”而不是$ i == 19)。
有关详细信息,请参阅这些参考资料:
答案 2 :(得分:15)
当变量可以是INTEGER或STRING表示整数时检查正整数的最佳方法:
if ((is_int($value) || ctype_digit($value)) && (int)$value > 0 ) { // int }
如果值类型为is_int()
, integer
将返回true。如果类型为ctype_digit()
,则string
将返回true,但字符串的值为整数。
此检查与is_numeric()
之间的区别在于is_numeric()
即使对于表示非整数数字的值(例如“+0.123”),也会返回true。
答案 3 :(得分:12)
它肯定会走向微优化的领域,但是嘿:我正在研究的代码每天都在咀嚼数百万件物品,而且是周五。所以我做了一些实验...
for ($i = 0; $i < 1000000; $i++) {
// Option 1: simple casting/equivalence testing
if ((int) $value == $value && $value > 0) { ... }
// Option 2: using is_int() and ctype_digit(). Note that ctype_digit implicitly rejects negative values!
if ((is_int($value) && $value > 0) || ctype_digit($value)) { ... }
// Option 3: regular expressions
if (preg_match('/^\d+$/', $value)) { ... }
}
然后我为整数和字符串值运行了上述测试
选项1:简单的投射/等效性测试
选项2:使用is_int()和ctype_digit()
选项3:正则表达式
也许不足为奇的是,选项1是迄今为止最快的,因为没有函数调用,只是强制转换。值得注意的是,与其他方法不同,选项1将string-float-integer值“5.0”视为整数:
$valList = array(5, '5', '5.0', -5, '-5', 'fred');
foreach ($valList as $value) {
if ((int) $value == $value && $value > 0) {
print "Yes: " . var_export($value, true) . " is a positive integer\n";
} else {
print "No: " . var_export($value, true) . " is not a positive integer\n";
}
}
Yes: 5 is a positive integer
Yes: '5' is a positive integer
Yes: '5.0' is a positive integer
No: -5 is not a positive integer
No: '-5' is not a positive integer
No: 'fred' is not a positive integer
对于您的特定用例而言,这是否是一件好事,留给读者练习......
答案 4 :(得分:5)
检查整数的另一种最佳方法是使用正则表达式。您可以使用以下代码检查Integer值。浮点值将为false。
if(preg_match('/^\d+$/',$i)) {
// valid input.
} else {
// invalid input.
}
最好是否可以检查$ i&gt; 0也是。
答案 5 :(得分:2)
而不是检查具有多个条件的class Test : UIView {
var faceCenter : CGPoint = CGPointZero // give a default value, give correct value in the init method
var faceCenterAlpha: CGPoint { // getter
print("getter")
return convertPoint(center, fromView: superview)
}
lazy var faceCenterBeta: CGPoint = { [unowned self] in // closure
print("closure")
return self.convertPoint(self.center, fromView: self.superview)
}()
func faceCenterDelta() -> CGPoint { // good ol' function
print("function")
return convertPoint(center, fromView: superview)
}
init() {
super.init(frame: CGRectZero)
faceCenter = convertPoint(center, fromView: superview)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
let test = Test()
// executed every time, just like a function
test.faceCenterAlpha
test.faceCenterAlpha
test.faceCenterAlpha
// only executed once
test.faceCenterBeta
test.faceCenterBeta
test.faceCenterBeta
OR int
,如:
string
您可以通过将输入转换为if ( ctype_digit($i) || ( is_int($i) && $i > 0 ) )
{
return TRUE;
}
来简化此操作,以便一个(string)
来电同时检查ctype_digit
和string
输入:
int
答案 6 :(得分:2)
Laravel 4.2正数验证规则
只需要正数,包括浮点值。
public static $rules = array(
'field_name' => 'required|regex:/^\d*\.?\d*$/'
);
e.g:20,2.6,06
答案 7 :(得分:2)
定义:
!A = !is_numeric($i)
B = $i < 1
!C = $i != round($i)
则...
!is_numeric($ i)|| $ i&lt; 1 || $ i!= round($ i)等于 !A || B || !ç
所以:
!A || B || !C = !A || !C || B
现在,使用deMorgan定理,即(!A ||!C)=(A&amp;&amp; C),然后:
!A || !C || B = (A && C) || B
现在,请注意A&amp;&amp; C = is_numeric($ i)&amp;&amp; $ i == round($ i),但如果$ i == round($ i)为TRUE,则is_numeric($ i)也为TRUE,因此我们可以简化A&amp;&amp; C = C so,
(A&amp;&amp; C)|| B = C || B =
$i == round($i) || $i < 1
所以你只需要使用:
$i = $user_input_value;
if ($i == round($i) || $i < 1) {
return TRUE;
}
答案 8 :(得分:2)
除了所有其他答案:您可能正在寻找ctype_digit
。它查找仅包含数字的字符串。
答案 9 :(得分:1)
检查正整数使用:
$i = $user_input_value;
if (is_int($i) && $i > 0) {
return true; //or any other instructions
}
OR
$i = $user_input_value;
if (!is_int($i) || $i < 1) {
return false; //or any other instructions
}
使用符合您目的的那个,因为它们是相同的。以下示例演示了is_numeric()
和is_int()
:
is_numeric(0); // returns true
is_numeric(7); // returns true
is_numeric(-7); // returns true
is_numeric(7.2); // returns true
is_numeric("7"); // returns true
is_numeric("-7"); // returns true
is_numeric("7.2"); // returns true
is_numeric("abc"); // returns false
is_int(0); // returns true
is_int(7); // returns true
is_int(-7); // returns true
is_int(7.2); // returns false
is_int("7"); // returns false
is_int("-7"); // returns false
is_int("7.2"); // returns false
is_int("abc"); // returns false
答案 10 :(得分:1)
所有这些答案都忽略了请求者可以检查表单输入的事实 is_int()将失败,因为表单输入是一个字符串 对于浮点数,is_numeric()也是正确的 这就是为什么$ i == round($ i)进来,因为它检查输入是一个整数。
答案 11 :(得分:1)
好的,我知道这个帖子真的很老了,但我同意@Jeffrey Vdovjak的观点:既然我能找到它,它可能仍然可以帮助其他人。
php的gmp_sign()可能是另一种简单的检查方法。它适用于整数和数字字符串,如果a为正则返回1,如果a为负则返回-1,如果a为0则返回0。
所以:
// positive
echo gmp_sign("500") . "\n";
// negative
echo gmp_sign("-500") . "\n";
// zero
echo gmp_sign("0") . "\n";
将输出:
1
-1
0
请参阅http://php.net/manual/en/function.gmp-sign.php
上的功能手册P.S。您需要在.ini文件中启用php_gmp.dll。
答案 12 :(得分:1)
preg_match('{^[0-9]*$}',$string))
如果你想限制长度:
preg_match('{^[0-9]{1,3}$}',$string)) //minimum of 1 max of 3
S positive int,最大长度为6:
if(preg_match('{^[0-9]{1,6}$}',$string)) && $string >= 0)
答案 13 :(得分:1)
你真的不需要使用所有三个检查,如果你想要一个正整数,你可能想要做与你的代码相反的事情:
if(is_numeric($i) && $i >= 0) { return true; }
查看Sören的答案,了解有关is_int()
和is_numeric()
之间差异的更多信息
答案 14 :(得分:1)
if(preg_match('/^[1-9]\d*$/',$i)) {
//Positive and > 0
}
答案 15 :(得分:1)
第一个例子是使用round
来验证输入是一个整数,而不是一个不同的数值(即:十进制)。
is_int将返回false。请参阅PHP manual examples for is_int
答案 16 :(得分:0)
if(isset($i) && is_int($i) && $i >= 0){ //0 is technically a postive integer I suppose
return TRUE; //or FALSE I think in your case.
}
答案 17 :(得分:0)
如果使用“is_int”,则变量必须为整数,因此它不能是浮点值。 (不需要轮次)。
答案 18 :(得分:0)
我会做这样的事情:
if ((int) $i > 0) {
// this number is positive
}
根据前面的减号,该数字被转换为正数或负数。然后将类型转换数大于0,以确定该数字是否为正。
答案 19 :(得分:0)
这是我的解决方案,希望对您有所帮助:
if (is_numeric($i) && (intval($i) == floatval($i)) && intval($i) > 0)
echo "positive integer";
我检查字符串是否为数字,第二次检查确定它是否为整数,第三次检查确定为正数