não é possível determinar se uma string é, atualmente, um número inteiro ou não

StackOverflow https://stackoverflow.com/questions/9505466

  •  14-11-2019
  •  | 
  •  

Pergunta

O seguinte funciton me deixou louco.Como na terra, 100x poderia ser igual a 100 e, em seguida, 100x é relatado como um número inteiro?
Para a vida de mim, eu não posso descobrir.Você pode copiar e colar a coisa toda e ver por si mesmo.
Eu estou sentindo falta de um simples ponto em algum lugar aqui, ajudar-me a sair caras.

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

o código acima, quando executar retorna o seguinte;

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!

Eu posso remediar a situação, adicionando o seguinte bits

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

para o topo da blp_int função direita fora do bastão, mas,..Eu ainda estou super curiosa para saber por que a terra php pensa 100x=100 são iguais.

Foi útil?

Solução

Como você pode ver na este exemplo, fundição 100x como um integer converte para 100.Desde que você não estiver usando comparação estrita, '100x' == 100 é verdade.PHP remove o x para fazer apenas 100.

Você pode usar comparação estrita (que também compara os tipos), tal que '100x' === 100 retornará falso.Usando-a, a qualquer momento em uma seqüência de caracteres foi comparado a um inteiro, ele retornará falso.


Como por sua editar: is_numeric pode não ser o mais confiável, como ele irá retornar true para números formatados como uma seqüência de caracteres, tais como '100'.Se você deseja que o número a ser um inteiro (e nunca uma seqüência de caracteres), você pode usar is_integer em vez disso.Eu não tenho certeza do que exatamente você está fazendo, mas eu pensei que eu iria adicionar esta nota.

Outras dicas

Eu acho que você deve usar três sinais de igual, em seu CASO:

if ($orgval===$num) {

Caso contrário, o PHP converte o valor de 100x para 100 e 100=100.

Documentação:Operadores De Comparação

Que tipo de verificação que deseja fazer?Existem algumas maneiras que você pode ir sobre ele:

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

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

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

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

Isso depende de quão perto você deseja verificar se é um número inteiro.Não importa se você precisar trim() ele primeiro?

Quer lançá-lo para um int ou tentar http://php.net/manual/en/function.ctype-digit.php.Você também precisa === em seu caso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top