【问题标题】:PHP check if object can be converted to integer?PHP检查对象是否可以转换为整数?
【发布时间】:2012-03-22 20:48:45
【问题描述】:

在 PHP 中,似乎每个对象都可以转换为整数,只需调用intval($object),但这不是我想要的。我想要的是,检查对象是否可以有效地转换为人类认为的整数。

即,有效的对象是

  • 12
  • 12.0
  • "12"
  • "12.0"

并且无效将是

  • MyFooInstance()
  • "some string"
  • "12.0.0"
  • "0 12.0"

等等。 在python中,我可以简单地做到以下几点:

try:
    int(var)
except (TypeError, ValueError):
    return False
return True

如何在 PHP 中实现这一点?

【问题讨论】:

标签: php int type-conversion


【解决方案1】:

整数(不仅仅是数字)测试: http://codepad.org/3E8IYHKY

function to_int_or_null( $v ){
  if( is_int(     $v ))  return $v; 
  if( is_float(   $v ))  return $v === (float)(int)$v  ?  (int)$v  :  null;
  if( is_numeric( $v ))  return to_int_or_null( +$v );
  return null;
}

结果:

int(1)                                  int(1)
float(1)                                int(1)
float(-0)                               int(0)
string(2) "-1"                          int(-1)
string(2) "+1"                          int(1)
string(1) "1"                           int(1)
string(2) " 1"                          int(1)
string(2) "01"                          int(1)
string(3) " 01"                         int(1)
string(4) " -01"                        int(-1)
string(3) "1e0"                         int(1)
string(4) "1.00"                        int(1)
string(18) "1.0000000000000001"         int(1)
string(18) "0.0000000000000001"         NULL
string(17) "1.000000000000001"          NULL
string(4) "1.11"                        NULL
string(4) "1e40"                        NULL
string(6) "1e9999"                      NULL
float(1.1100000000000000977)            NULL
float(1.0000000000000000304E+40)        NULL
float(INF)                              NULL
string(4) "0xFF"                        NULL or int(255) !!!
string(6) "0b1111"                      NULL
string(5) "123  "                       NULL
string(0) ""                            NULL
string(2) "  "                          NULL
string(6) "123foo"                      NULL
string(6) "foo456"                      NULL
string(3) "foo"                         NULL
bool(true)                              NULL
bool(false)                             NULL
NULL                                    NULL
array(0) {}                             NULL
object(stdClass)#7 (0) {}               NULL

旧的、错误的答案 http://codepad.org/LoqfAgNl
整数值浮点类型失败:(double)123

function is_integerable( $v ){
  return is_numeric($v) && +$v === (int)(+$v);
}

【讨论】:

  • 非常感谢,但is_numeric 也适合。 :)
【解决方案2】:

请参阅 PHP 的 ctype_digit()。

此函数评估字符串以查看所有字符是否都是数字。因此"1.1" 不会返回true,因为"." 不是数字,但"11" 会。另请注意,这仅适用于字符串,因此不带引号的数字也将不起作用。

【讨论】:

    【解决方案3】:

    试试这个

    if((int)$variable) {...
    

    【讨论】:

    • if( (int)$variable ) 中的条件将在 $variable == 0 时计算为 false。
    • 是的,忘了那个“小”细节:)
    【解决方案4】:

    查看is_numeric($var):http://php.net/is_numeric

    【讨论】:

      【解决方案5】:

      使用is_numeric。

      <?php
      $tests = array(
          "42", 
          1337, 
          "1e4", 
          "not numeric", 
          array(), 
          9.1
      );
      
      foreach ($tests as $element) {
          if (is_numeric($element)) {
              echo "'{$element}' is numeric", PHP_EOL;
          } else {
              echo "'{$element}' is NOT numeric", PHP_EOL;
          }
      }
      ?>
      
      
      '42' is numeric
      '1337' is numeric
      '1e4' is numeric
      'not numeric' is NOT numeric
      'Array' is NOT numeric
      '9.1' is numeric
      

      (来自页面)

      【讨论】:

      • 谢谢,一定错过了!
      猜你喜欢
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      相关资源
      最近更新 更多