【问题标题】:Checking if a string contains an integer检查字符串是否包含整数
【发布时间】:2011-03-23 14:17:27
【问题描述】:

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

这是我期望它的工作方式:

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

【问题讨论】:

  • (related) Check whether the string is a unix timestamp - 测试基本一样
  • @mathk:我需要验证用户输入。
  • 究竟什么输入被认为是有效的?
  • 你认为'1.0'、'0xFF'或'0123'(八进制)作为测试的整数,如果你传入一个整数而不是字符串呢?
  • @Gumbo:在我正在处理的情况下,任何自然数都将被视为有效输入。

标签: php validation


【解决方案1】:
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

如果使用=== 而不是== 进行比较,这将如何表现不同,请参阅下面的 Gordon 回答。

【讨论】:

  • 这应该用=== 测试并确保数字在整数范围内
  • 如果 $var 实际上是整数, === 将不起作用。 == 都会,不管是字符串还是int。 OP 没有具体要求,但如果它实际上是一个整数,则返回 false 似乎有点不正常。
  • @Gordon:转换为整数总是会产生一个有效的整数。
  • 我宁愿做类似(string)(int)$var === (string)$var 的事情,以消除我在您的列表中看到的误报1.0
  • @nyson,你应该回答这个问题,这样我就可以投票了。
【解决方案2】:

不是最快的方法,但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 !!

【讨论】:

  • 我刚刚使用了你的函数,它在处理大量数字时遇到了问题。鉴于要求是检查字符串是否包含整数,但没有说明它有多长,我相信在这种情况下,正则表达式方法可能会更好。对于像 999999999999999999 这样的数字,它会起作用,但是如果您尝试使用包含数字 99999999999999999999(这是一个有效整数)的字符串,它将失败。
  • @JeanPaulRuiz 当然,这是一种解释方式,我的方法检查它是否可以分配给变量:)
【解决方案3】:

不想不小心把 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

【讨论】:

  • 1.0 (float) 和 0123 (invalid) 这里的结果比我的版本好——我没有考虑过它们!
  • @Jhong using == 对于十六进制 0xFF 和科学记数法 -1.3e3 也将返回 true(例如,当不用作字符串时,如果用作字符串则返回 false)
【解决方案4】:

更新自 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。但这很容易解决 :)

【讨论】:

  • 当一个值实际上不是数字时,例如foo,我得到以下PHP错误A non-numeric value encountered。我正在使用PHP 7.1.3An answer related to this。还有They advice not to use is_int() here
  • 感谢您的评论@Pathros - 正如您所看到的,这是一个 7 年前的答案,所以看起来自 PHP 7.1 以来行为发生了变化。我将编辑我的答案以记录更改。
【解决方案5】:

其他选项

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

【讨论】:

  • 这(以其当前形式)也不考虑负整数。
  • regex 是一个相当耗费资源的解决方案,可以解决一个表面上很简单的问题(我不反对你)。
  • 现在你的正则表达式允许12-34。你应该使用/^-?[0-9]+$/。如果你想拒绝前导零(你应该)使用/^-?[1-9][0-9]*$/
  • 关于中间减号的好点,更新了代码!注意:我并不是因为投反对票本身而抱怨,只是问为什么它不正确。至于正则表达式是资源密集型的,这实际上取决于它被调用的频率,在某些情况下它可能不好,但对其他人来说绝对没问题。
  • 正则表达式:现在你有两个问题
【解决方案6】:

如果字符串包含空格,那么@Jack 的答案将不会提供准确的结果。 例如

$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 ';
}

【讨论】:

  • 实际上,我的回答为true 产生"19 ";您一定对 Jhong 的回答感到困惑。
【解决方案7】:

ctype_digit 可以解决问题:

ctype_digit($str)

  1. $str 必须是字符串
  2. 不允许有多余的空格
  3. 没有小数点.

【讨论】:

    【解决方案8】:

    我已经用了很长时间了。虽然所有其他答案都有缺点或特殊情况,但如果您想检测任何可能的 int 值的东西,包括 1.0 "1.0" 1e3 "007" 那么你最好让 is_numeric 完成它的工作来检测任何可能的代表一个数字的 PHP 对象,然后才检查该数字是否真的是一个 int,将其转换为 int 并返回到 float,并测试它是否改变了值。:

    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);
    }
    

    或者

     function isIntValued($var) {
        return (is_numeric($var) && ((float)(int)(float)$var)===(float)$var);
    }
    

    请注意,虽然 PHP 的 is_int() 检查变量的 类型 是否为整数,但相反,其他标准 PHP 函数 is_numeric() 非常准确地确定变量的 内容是否(即字符串字符)可以表示一个数字。

    相反,如果您希望“1.0”和“2.00”不被视为整数而是浮点数(即使它们具有整数值),那么另一个答案(@Darragh Enright)使用 is_numeric,添加零并测试int 可能是最正确的解决方案:

        is_numeric($s) && is_int($s+0)
    

    【讨论】:

      【解决方案9】:

      也许这在特定情况下也会有所帮助 php中有一个函数已经这样做了,它叫做“is_numeric()” 它会相应地返回真或假..

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

      链接:http://www.php.net/is_numeric

      你说"holdsint("2")应该返回true,那么is_numeric("2")返回True,is_numeric("a")返回False,果然,这个函数存在于php中,无需重写。

      【讨论】:

      • 这是不正确的; is_numeric() 为浮点数返回 true
      • 啊,是的,但就像这里的大多数事情一样,在发布时原始问题没有提到浮动是正确的,然后原始海报去编辑了他的问题,所以现在我看起来像个白痴。典型的。
      【解决方案10】:

      比较.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
      

      【讨论】:

      • 除了 0123 是一个 int
      • @FrancescoMM 哎哟。是的。
      【解决方案11】:

      可能有两种情况-

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

      2. 你想检查一个字符串是否包含一个特定的数字

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

      【讨论】:

        【解决方案12】:

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

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

        (这将作为评论发布@nyson,但我还没有足够的权限这样做)。

        编辑添加: 如果您希望零为真,则需要执行类似的操作

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

        【讨论】:

          【解决方案13】:

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

          Assertion::integerish($var);
          

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

          【讨论】:

            【解决方案14】:

            is_int 是完成这项工作的唯一目的。

            【讨论】:

            • is_int 确定变量的 type 是否为整数,而不是 value
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-11-20
            • 2020-06-27
            • 1970-01-01
            • 2012-05-06
            • 1970-01-01
            • 2015-02-07
            相关资源
            最近更新 更多