O PHP possui uma intval()
função que converterá uma string em um número inteiro. No entanto, quero verificar se a string é um número inteiro de antemão, para que eu possa dar uma mensagem de erro útil ao usuário, se estiver errada. O PHP possui is_int()
, mas isso retorna false para strings como "2"
.
O PHP tem a is_numeric()
função, mas isso retornará true se o número for um dobro. Eu quero algo que retorne falso para um duplo, mas verdadeiro para um int.
por exemplo:
my_is_int("2") == TRUE
my_is_int("2.1") == FALSE
Respostas:
Que tal usar
ctype_digit
?Do manual:
O exemplo acima apresentará:
Isso funcionará apenas se sua entrada for sempre uma string:
Se sua entrada for do tipo
int
, combinectype_digit
comis_int
.Se você se importa com números negativos, precisará verificar a entrada para obter uma precedente
-
e, se for o caso, chamarctype_digit
umasubstr
da sequência de entrada. Algo assim faria:fonte
ctype_digit(abs($str))
vez de apenasctype_digit
.abs('definitelynotanint') === 0
. além disso,ctype_digit
leva apenas seqüências de caracteresfilter_var
deve fazê-lo:mas
Se você deseja apenas os booleanos como valores de retorno, envolva-os em uma função, por exemplo
fonte
==
talvez?if
3v4l.org/IAvCF+1 na resposta de Dominic (usando
ctype_digit
). Outra maneira de fazer isso é com coerção de tipo:fonte
is_int($inty + 0) && is_numeric($inty)
(eu sei que é uma solução preguiçoso, mas obras para a maioria das intenções e propósitos ...Faça a conversão para int. se ainda tiver o mesmo valor, int;
fonte
return $var == (int) $var;
Fonte .
fonte
elseif
pode ser apenasif
porque você já retornou na declaração acima.$data
for um objeto, isso retornaránull
. Melhor terreturn false;
o final.Tinha uma necessidade de um robusto
is_int
recentemente. Achei intval () imprevisível demais:Me deparei com esse trecho nos comentários da documentação do PHP e, após testá-lo, ele cobre quase tudo o que você lança nele:
Mas cuidado:
fonte
Uma maneira realmente limpa que eu gosto de usar é essa. Você o lança duas vezes, primeiro
int
, segundostring
e depois faz uma comparação rigorosa===
. Veja o exemplo abaixo:Agora, sobre sua função my_is_int, você pode fazer algo assim:
fonte
fonte
'/^[-+]?[0-9]+$/'
Estou usando este:
fonte
Você pode apenas verificar se há um número, se for então verificar que o vazamento recebe um dobro ou não:
Apenas para números positivos:
Verificando:
Resultado:
fonte
Tente o seguinte:
Também funciona se a sua string $ tiver casas decimais
fonte
Isso cuidará do número negativo também
fonte
fonte
Eu inventei uma maneira que não consegui encontrar em lugar nenhum, então estou colocando aqui:
Sem mais delongas, é o seguinte:
ctype_digit((string) abs($input))
Exemplo:
Resultados: (são como esperado, suponho)
fonte
Talvez não seja a maneira mais eficiente de fazer isso. Mas você pode escrever em uma linha.
Como esperado:
Peguei vocês:
fonte
Alguns anos atrasado, mas com base nas respostas dadas aqui, encontrei uma solução um pouco mais precisa (em booleanos, em particular) e mais eficiente (acho) do que a maioria das outras respostas:
Trabalhando conforme o esperado para estes:
Exceto, talvez, estes 2:
fonte
E se:
Esta função só deve retornar true para qualquer número de string que possa ser convertido para int com
(int)
ouintval()
sem perder nada de significado matemático (como zeros após ponto decimal ou números fora do intervalo inteiro do PHP) enquanto aceita coisas que não são matematicamente significativas (como espaço em branco; zeros à esquerda) ou, após o ponto decimal, zeros exclusivamente).Retornará false para,
'10.'
mas não para'10.0'
. Se você quisesse'10.'
ser verdade, poderia mudar o+
depois do0
na expressão regular para*
.fonte
Aqui, usei algum código que parece funcionar bem e não possui nenhum dos problemas que muitos outros têm.
Ele não verifica a ordem, etc., portanto não se destina a números inteiros negativos, mas com algum código de adição que pode ser feito usando algumas das outras idéias acima. Também pode ser adaptado para trabalhar com binários
array('0', '1')
ou hexadecimais, etc.fonte
Veja isso. Converte $ val em número inteiro e, em seguida, verifica se o $ val original convertido em string é IDENTICAL (===) - apenas == não funcionará conforme o esperado - no valor inteiro convertido em string.
Se você não verificar os valores das strings, pode não funcionar como o esperado:
Resultado:
Razão mesmo que você use hex (0x101010), octal (01) ou um número inteiro armazenado como float (1.0, 0.0), internamente todos serão armazenados como float. No entanto, se você usar a função para procurar int armazenado como uma sequência, ela funcionará.
fonte
fonte
Você pode usar a seguinte condição. Observe que você não deve usar! ==
fonte
Funciona perfeitamente! Espero que seja útil para você =)
fonte
Se você quiser realmente saber se uma string é uma representação válida de um verdadeiro tipo inteiro PHP ...
No entanto, isso é impossível de ser executado, pois o conjunto é muito grande (nesse caso, não caberá na memória, se você fizer um loop, em seguida, serão necessários muitos ciclos de CPU).
Talvez você possa fazer uma pesquisa binária com comparação de cadeias, no entanto, existem maneiras melhores.
O ser mais simples:
Existem outras maneiras incomuns de abordá-lo, como:
Você também pode fazer comparação de strings, mas ainda precisará fazer coisas como ctype_digit, verificar se o tamanho é razoável (não desperdice CPU antes de fazer coisas como ctype_digit) e ter um tratamento estranho para números negativos.
Observe que filter_var não afirma corretamente que uma string é realmente a representação de um número inteiro PHP. Permitirá um + e um espaço em branco circundante.
Internamente, o PHP usa a função "_zend_handle_numeric_str" para comparação estrita, mas não a expõe diretamente em nenhum lugar, daí o truque usando as chaves da matriz (que a utiliza para converter qualquer sequência que seja uma representação de um número inteiro do PHP em um número inteiro do PHP).
Se você deseja uma conversão binária segura de e para PHP, esta é a abordagem a ser adotada.
Nem todo mundo pode querer isso e pode ser um caso de manipulação de entrada do usuário. filter_var não é tão ruim assim e será bastante seguro na maioria dos casos para pessoas novas no PHP.
Uma verificação de comprimento, ctype_digit e, em seguida, uma verificação do valor convertido em um intervalo também é bastante sólido para a entrada do usuário. Esquemas mais complexos podem querer aparar ou regex.
O problema com muitas das respostas aqui a esse respeito é que, embora a pergunta seja vaga, as respostas não devem ser. Se você vai propor uma solução, deve ser capaz de explicar exatamente o que ela vai esperar e o que não vai esperar. Sem isso, não há como saber se uma resposta corresponde a uma pergunta ou é segura. O manual do PHP nem sempre ajuda porque não explica todas as advertências de cada um dos métodos relevantes que ele fornece. Coisas como ctype_digit e is_int são muito confiáveis e fáceis de editar, mas as especificidades de is_numeric, filter_var e malabarismo (+ $ var) ou conversão (intval / floatval) são pouco documentadas.
Este é o fudge do PHP para você. Possui um número incontável de esquemas para interpretar cadeias de caracteres como números inteiros, com inconsistências. O método mais estrito de validar uma sequência inteira não é exposto diretamente ao usuário.
fonte
Se você está manipulando IDs numéricos do mysql e está tentando impor uma validação para que seja um int zero diferente de zero ou um
int
formato mas em formato de string ( como o mysql sempre retorna tudo em formato de string ) e nãoNULL
. Você pode usar o seguinte. Esta é a maneira mais prova de erro / aviso / aviso para permitir apenas oint/string-ints
que encontrei.fonte
Aqui está uma solução simples que usa is_numeric , floatval e intval :
Resultados:
Observe que valores maiores que PHP_INT_MAX podem retornar false.
fonte
Poderia usar is_numeric () e verificar a presença de "." na string (não particularmente sensível à cultura).
Como alternativa, use is_numeric () e depois converta para um dobro e veja se $ var == floor ($ var) (deve retornar true se for um número inteiro).
fonte