Impossibile determinare se una stringa è attualmente un numero intero o meno
Domanda
Il seguente funciton mi ha spinto dadi.Come in Terra 100x potrebbe essere uguale a 100 e poi 100x è riportato come un numero intero?
Per la vita di me, non riesco a capirlo.
Puoi copiare e incollare il tutto e vederlo per te.
Mi manca un semplice punto da qualche parte qui, aiutami fuori dai ragazzi.
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>";
}
.
Il codice sopra, quando esegui la corsa ritorna il seguente;
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!
.
Posso rimediare alla situazione aggiungendo i seguenti bit
if (!is_numeric($val))
{
return false;
}
.
alla parte superiore della funzione BLP_INT proprio fuori dal pipistrello ma, .. Sono ancora super curioso di scoprire perché sulla Terra PHP pensa che 100x= 100 siano uguali.
Soluzione
As you can see in this example, casting 100x
as an integer converts it to 100
. Since you are not using strict comparison, '100x' == 100
is true. PHP removes the x
from it to make just 100
.
You could use strict comparison (which also compares the types), such that '100x' === 100
would return false. Using it, any time a string was compared to an integer, it would return 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'
. If you want the number to be an integer (and never a string), you could use is_integer
instead. I'm not quite sure what exactly you're doing, but i thought I'd add this note.
Altri suggerimenti
I think you should use three equal signs in your IF:
if ($orgval===$num) {
Otherwise PHP casts the value 100x
to 100
and 100=100
.
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?
Either cast it to an int
or try http://php.net/manual/en/function.ctype-digit.php. You also need ===
in your if.