查看数字是“实数”(int / float)还是字符串(“1”/“1.2”)的最佳方法

时间:2011-11-10 19:47:24

标签: php numbers

我有一个从我的代码中反复调用的函数,我可以传递一个变量,如果参数是一个“真实”(int / float)数字,函数的行为会有所不同(换句话说,不执行任何操作)传递给MySQL查询时也不要在它周围添加引号。目前我的代码进行了双重检查,但有更好的方法吗?

$a = 1;
$b = '1';
$is_num = (is_numeric($a) && !is_string($a)); //true
$is_num = (is_numeric($b) && !is_string($b)); //false

有更好的方法吗?

例如(非常简化的版本):

$query = 'SELECT * FROM `table` WHERE ';
$field = 'id';
$operator = '=';
$value = 2;

$query .= '`'.$field.'`'.$operator;
$is_num = (is_numeric($value) && !is_string($value));
if($is_num){
    $query .=$value;
}else{
    $query .='"'.mysql_real_escape_string((string)$value).'"';
}
$query .=';';

3 个答案:

答案 0 :(得分:2)

如果您的号码始终是整数,那么您可以使用is_int。如果有可能它可能是小数点数,并且您希望返回$is_num == true然后否,则必须按原样进行检查或选中is_int($a) || is_float($a)

is_numeric的具体目的是检查它是“数字还是数字字符串”,并且没有“所有数字类型”全部捕获。

但是,鉴于您的评论是针对查询构建器的,为什么不在is_string添加引号而不是其他名称?

答案 1 :(得分:1)

如果您只处理整数,is_int($a)有效。如果你也在处理花车,请使用

is_int($a) || is_float($a)

答案 2 :(得分:0)

function is_number($input)
{
    if ( ! is_int($input) AND is_numeric($input))
    {
        return (float) $input === $input;
    }
    else
    {
        return (int) $input === $input;
    }
}

echo is_number('1.23')? 'true': 'false'; # false
echo is_number(1.23)? 'true': 'false'; # true
echo is_number(1)? 'true': 'false'; # true
echo is_number('1')? 'true': 'false'; # false

最好转换为字符串,因为如果是字段类型,SQL将转换为int / float。