你知道一个函数可以检查字符串是否包含整数吗?
以下是我希望它的工作方式:
holds_int("23") // should return true.
holds_int("2.3") // should return false.
holds_int("qwe") // should return false.
Run Code Online (Sandbox Code Playgroud)
Jho*_*ong 64
if((string)(int)$var == $var) {
echo 'var is an integer or a string representation of an integer';
}
Run Code Online (Sandbox Code Playgroud)
示例结果:
var_dump( test(1) ); // TRUE
var_dump( test('1') ); // TRUE
var_dump( test('1.0') ); // TRUE
var_dump( test('1.1') ); // false
var_dump( test('0xFF') ); // false
var_dump( test('0123') ); // TRUE
var_dump( test('01090') ); // TRUE
var_dump( test('-1000000') ); // TRUE
var_dump( test('+1000000') ); // TRUE
var_dump( test('2147483648') ); // false
var_dump( test('-2147483649') ); // false
Run Code Online (Sandbox Code Playgroud)
请参阅下面的戈登的答案,了解如果===用于比较而不是用于表示这种行为会有何不同==.
Ja͢*_*͢ck 12
不是最快的方法,但是filter_var()非常准确:
function test($s)
{
return filter_var($s, FILTER_VALIDATE_INT) !== false;
}
Run Code Online (Sandbox Code Playgroud)
以下是基于Jhong 答案的结果,差异标记为!!:
var_dump(test(1) ); // true
var_dump(test('1') ); // true
var_dump(test('1.0') ); // false !!
var_dump(test('1.1') ); // false
var_dump(test('0xFF') ); // false
var_dump(test('0123') ); // false !!
var_dump(test('01090') ); // false !!
var_dump(test('-1000000') ); // true
var_dump(test('+1000000') ); // true
var_dump(test('2147483648') ); // true !! on 64bit
var_dump(test('-2147483649')); // true !! on 64bit
Run Code Online (Sandbox Code Playgroud)
允许八进制整数:
function test($s)
{
return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL) !== false;
}
Run Code Online (Sandbox Code Playgroud)
结果:
var_dump(test('0123') ); // true
var_dump(test('01090')); // false !!
Run Code Online (Sandbox Code Playgroud)
要允许十六进制表示法:
function test($s)
{
return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX) !== false;
}
Run Code Online (Sandbox Code Playgroud)
结果:
var_dump(test('0xFF')); // true !!
Run Code Online (Sandbox Code Playgroud)
Gor*_*don 11
不想意外地将Jhong的答案变成CW,所以这里的记录是测试时的结果===而不是==.
function test($var) {
return ((string)(int)$var === $var);
}
var_dump( test(1) ); // returns false vs TRUE
var_dump( test('1') ); // returns TRUE
var_dump( test('1.0') ); // returns false vs TRUE
var_dump( test('1.1') ); // returns false
var_dump( test('0xFF') ); // returns false
var_dump( test('0123') ); // returns false vs TRUE
var_dump( test('-0123') ); // returns false vs TRUE
var_dump( test('-1000000') ); // returns TRUE
var_dump( test('+1000000') ); // returns false vs TRUE
var_dump( test('2147483648') ); // returns false
var_dump( test('-2147483649') ); // returns false
Run Code Online (Sandbox Code Playgroud)
更新自PHP 7.1起,使用
is_int()非数字值时出现问题,如本SO答案中所述.在任何情况下,这是一个非常古老的答案,我真的认为它在这一点上是一个黑客,所以YMMV;)
很抱歉,如果这个问题已得到解答,但过去这对我有用:
首先检查字符串is_numeric.如果它是一个0值,以使PHP将字符串转换为其相关类型.然后你可以检查它是否是一个int is_int.快速而肮脏,但它适合我...
$values = array(1, '2', '2.5', 'foo', '0xFF', 0xCC, 0644, '0777');
foreach ($values as $value) {
$result = is_numeric($value) && is_int(($value + 0)) ? 'true' : 'false';
echo $value . ': ' . $result . '<br />';
}
Run Code Online (Sandbox Code Playgroud)
结果:
1: true
2: true
2.5: false
foo: false
0xFF: true
204: true
420: true
0777: true
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,它将逐字地评估包裹在字符串中的八进制值,即:'0123'将简单地变为123.但这很容易解决:)