检查字符串是否包含整数

时间:2010-07-31 09:25:52

标签: php validation

您是否知道可以检查字符串是否包含整数的函数?

以下是我希望它能够发挥作用的方式:

holds_int("23") // should return true.  
holds_int("2.3") // should return false.  
holds_int("qwe") // should return false.

14 个答案:

答案 0 :(得分:64)

if((string)(int)$var == $var) {
    echo 'var is an integer or a string representation of an integer';
}

示例结果:

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

请参阅下面的戈登答案,了解如果===用于比较==而不是{{1}},这会有何不同。

答案 1 :(得分:12)

不是最快的方法,但filter_var()非常准确:

function test($s)
{
    return filter_var($s, FILTER_VALIDATE_INT) !== false;
}

以下是基于Jhong answer的结果,差异标有!!

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

允许八进制整数:

function test($s)
{
   return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL) !== false;
}

结果:

var_dump(test('0123') ); // true
var_dump(test('01090')); // false !!

允许使用十六进制表示法:

function test($s)
{
   return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX) !== false;
}

结果:

var_dump(test('0xFF')); // true !!

答案 2 :(得分:11)

不要不小心将Jung的答案转换为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

答案 3 :(得分:8)

  

更新自PHP 7.1起,将is_int()与非数字值一起使用时出现问题,如SO Answer中所述。在任何情况下,这是一个非常古老的答案,我真的认为这是一个黑客攻击,所以YMMV;)

很抱歉,如果这个问题已得到解答,但过去这对我有用:

首先检查字符串is_numeric。如果它是为值添加0以使PHP将字符串转换为其相关类型。然后你可以检查它是否是is_int的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 />';
}

结果:

1: true
2: true
2.5: false
foo: false
0xFF: true
204: true
420: true
0777: true

唯一的问题是,它将逐字地评估包裹在字符串中的八进制值,即:'0123'将简单地变为123.但这很容易解决:)

答案 4 :(得分:4)

其他选项

function holds_int($str)
   {
   return preg_match("/^-?[0-9]+$/", $str);
   }

答案 5 :(得分:4)

如果字符串包含空格,那么@ Jack的答案将无法提供准确的结果。 e.g。

$var = '19   ';
if((string)(int)$var == $var) {
echo 'var is an integer or a string representation of an integer';
}

根据上述检查,上述字符串不是int。

所以不要使用它,请尝试以下操作:

if(ctype_digit(trim('19  '))){
    echo 'it is digit ';
}else{
    echo 'it is not digit ';
}

答案 6 :(得分:3)

ctype_digit可以解决问题:

ctype_digit($str)

  1. $str必须是字符串
  2. 不允许使用额外的空格
  3. 无小数点.

答案 7 :(得分:2)

也许这在特定情况下也会有所帮助 php中有一个函数已经执行此操作,其名称为“is_numeric()” 它将永远地返回真假......

   if(is_numeric($somestring) == True){
        echo "this string contains a integar";
    }

link:http://www.php.net/is_numeric

你说“holdint(”2“)应该返回true,is_numeric(”2“)返回True,而is_numeric(”a“)False,正如预期的那样,这个函数存在于php中,不需要重写。< / p>

答案 8 :(得分:1)

可能有两种情况 -

  1. 你需要检查一个数字的确切字符串格式(大部分是关于这个的)

  2. 您想检查字符串是否包含特定数字

    preg_match('/'.$matching_number.'/',$container_string);

答案 9 :(得分:1)

comparison.php:

<?php
function is_numeric_int($s)
{
  return (strval(intval($s)) === $s);
}

function print_ini($s)
{
  echo "$s: " . ( is_numeric_int($s) ? 'true' : 'false' ) . "\n";
}

print_ini('qwe');
print_ini('23');
print_ini('-23');
print_ini('23.0');
print_ini('-23.0');
?>

试运行:

$ php comparison.php 
qwe: false
23: true
-23: true
23.0: false
-23.0: false

答案 10 :(得分:1)

我喜欢nyson的建议,但注意到'0123'会出错。 我现在正在这样做:

(string)(int)$var === ltrim((string)$var, '0')

(这可以作为评论@nyson发布,但我还没有足够的权限来做到这一点。)

编辑添加: 如果你想要零为真,你需要做类似的事情

(int)$var === 0 || (string)(int)$var === ltrim((string)$var, '0')

答案 11 :(得分:1)

很久以来我一直在使用它。 如果要检测任何可能的int值对象,包括1.0“ 1.0” 1e3“ 007”,则最好让is_numeric发挥作用以检测表示数字的任何可能的PHP对象,然后再检查如果该数字是整数。

function isIntValued($var) {
    if(is_numeric($var)) { // At least it's number, can be converted to float
        $var=(float)$var; // Now it is a float
        return ((float)(int)$var)===$var;
    }
    return FALSE;
}

或简而言之

function isIntValued($var) {
    return (!is_numeric($var)?FALSE:((float)(int)(float)$var)===(float)$var);
}

请注意,尽管PHP的is_int()检查变量的类型是否为整数,相反,其他标准的PHP函数is_numeric()却非常准确地确定了变量的内容(即字符串字符)可以代表数字。

答案 12 :(得分:0)

如果您在项目中使用Assert库(https://github.com/beberlei/assert),您可以轻松地在一行中执行:

Assertion::integerish($var);

注意:如果违反断言,它会抛出异常。

答案 13 :(得分:-3)

is_int是唯一能做这项工作的意思。