简体   繁体   English

无法确定字符串当前是否为整数

[英]unable to determine if a string is currently an integer or not

The following funciton drove me nuts. 以下功能使我发疯。 How on earth 100x could be equal to 100 and then 100x is reported as an integer? 地球上的100x如何等于100,然后将100x报告为整数?
For the life of me, I cannot figure it out. 对于我的一生,我无法弄清楚。 You can copy and paste the whole thing and see it for yourself. 您可以复制并粘贴整个内容,然后自己查看。
I'm missing a simple point somewhere here, help me out guys. 我在这里某处缺少一个简单的要点,请大家帮帮我。

function blp_int($val) {
    $orgval = $val;
    $num = (int)$val;    
    echo "<li><font color=red>val: ". $val . " is being checked to see if it's an integer or not";
    echo "<li><font color=red>orgval: ". $orgval ;
    echo "<li><font color=red>num: ". $num ;
    if ($orgval==$num) {
        echo "<li><font color=red><b>YES IT IS! the [{$orgval}] is equal to [{$num}]</b>";
        return true;
    }
    return false;
}

if (blp_int("100"))
{
    echo "<h1>100 is an integer!</h1>";
}
else
{
    echo "<h1>100 is NOT an integer!</h1>";
}

if (blp_int("100x"))
{
    echo "<h1>100x is an integer!</h1>";
}
else
{
    echo "<h1>100x is NOT an integer!</h1>";
}

the above code, when run returns the following; 上面的代码,运行时返回以下内容;

val: 100 is being checked to see if it's an integer or not
orgval: 100
num: 100
YES IT IS. the [100] is equal to [100]
100 is an integer!

val: 100x is being checked to see if it's an integer or not
orgval: 100x
num: 100
YES IT IS. the [100x] is equal to [100]
100x is an integer!

I can remedy the situation by adding the following bits 我可以通过添加以下内容来纠正这种情况

    if (!is_numeric($val))
    {
        return false;
    }

to the top of the blp_int function right off the bat but,.. I'm still super curious to find out why on earth php thinks 100x=100 are equals. 马上就到了blp_int函数的顶部,但是,..我仍然非常想知道为什么地球上php认为100x = 100是相等的。

As you can see in this example , casting 100x as an integer converts it to 100 . 本例所示 ,将100x转换为整数会将其转换为100 Since you are not using strict comparison , '100x' == 100 is true. 由于未使用严格比较 ,因此'100x' == 100为true。 PHP removes the x from it to make just 100 . PHP从中删除x ,得到100

You could use strict comparison (which also compares the types), such that '100x' === 100 would return false. 您可以使用严格比较(也可以比较类型),这样'100x' === 100将返回false。 Using it, any time a string was compared to an integer, it would return false. 使用它,每当将字符串与整数进行比较时,它将返回false。


As per your edit: is_numeric may not be the most reliable, as it will return true for numbers formatted as a string, such as '100' . 根据您的编辑: is_numeric可能不是最可靠的,因为它将对格式化为字符串的数字(例如'100'返回true。 If you want the number to be an integer (and never a string), you could use is_integer instead. 如果希望数字为整数 (而不是字符串),则可以使用is_integer I'm not quite sure what exactly you're doing, but i thought I'd add this note. 我不太确定您到底在做什么,但我想我要添加此注释。

I think you should use three equal signs in your IF: 我认为您应该在IF中使用三个等号:

if ($orgval===$num) {

Otherwise PHP casts the value 100x to 100 and 100=100 . 否则,PHP将值100x强制转换为100并且100=100

Documentation: Comparison Operators 文档:比较运算符

What kind of check do you want to do? 您要做什么支票? There are a few ways you could go about it: 有几种方法可以解决:

if (preg_match('!^[0-9]+$!', $input))

if (intval($input) == $input)

if (intval($input) === $input)

if ('x'.intval($input) === 'x'.$input)

It depends on how closely you want to check if it's an integer. 这取决于您要检查它是否为整数的紧密程度。 Does it matter if you need to trim() it first? 是否需要首先trim()它有关系吗?

Either cast it to an int or try http://php.net/manual/en/function.ctype-digit.php . 可以将其强制转换为int或尝试http://php.net/manual/en/function.ctype-digit.php You also need === in your if. 如果还需要===

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM