PHP a une intval()
fonction qui convertira une chaîne en entier. Cependant, je veux vérifier au préalable que la chaîne est un entier, afin de pouvoir envoyer un message d'erreur utile à l'utilisateur si ce n'est pas le cas. PHP a is_int()
, mais cela renvoie false pour une chaîne comme "2"
.
PHP a la is_numeric()
fonction, mais cela retournera vrai si le nombre est un double. Je veux quelque chose qui retournera faux pour un double, mais vrai pour un int.
par exemple:
my_is_int("2") == TRUE
my_is_int("2.1") == FALSE
Réponses:
Que diriez-vous d'utiliser
ctype_digit
?À partir du manuel:
L'exemple ci-dessus affichera:
Cela ne fonctionnera que si votre entrée est toujours une chaîne:
Si votre entrée est de type
int
, combinez-lactype_digit
avecis_int
.Si vous vous souciez des nombres négatifs, vous devrez vérifier l'entrée pour un précédent
-
, et si tel est le cas, appelerctype_digit
sur asubstr
de la chaîne d'entrée. Quelque chose comme ça le ferait:la source
ctype_digit(abs($str))
au lieu de justectype_digit
.abs('definitelynotanint') === 0
. de plus,ctype_digit
ne prend que des cordesfilter_var
devrait le faire:mais
Si vous voulez juste des booléens comme valeurs de retour, enveloppez-les dans une fonction, par exemple
la source
==
peut-être?if
3v4l.org/IAvCF+1 à la réponse de Dominic (en utilisant
ctype_digit
). Une autre façon de procéder consiste à utiliser la coercition de type:la source
is_int($inty + 0) && is_numeric($inty)
(je sais que c'est une solution paresseuse mais fonctionne pour la plupart des buts et objectifs ...Diffusez-le en int. s'il a toujours la même valeur, son int;
la source
return $var == (int) $var;
Source .
la source
elseif
peut simplement êtreif
parce que vous êtes déjà revenu dans la déclaration ci-dessus.$data
est un objet, cela reviendranull
. Mieux vaut avoir lereturn false;
à la fin.Avait besoin d'un robuste
is_int
récemment. J'ai trouvé intval () trop imprévisible:Je suis tombé sur cet extrait dans les commentaires de la documentation PHP, et après l'avoir testé, il couvre presque tout ce que vous lui lancez:
Mais attention:
la source
Une façon vraiment propre que j'aime utiliser est celle-là. Vous le lancez deux fois, d'abord dans
int
, ensuite dansstring
, puis vous comparez strictement===
. Voir l'exemple ci-dessous:Maintenant, à propos de votre fonction my_is_int, vous pouvez faire quelque chose comme ceci:
la source
la source
'/^[-+]?[0-9]+$/'
J'utilise celui-ci:
la source
Vous pouvez simplement vérifier un nombre, si c'est le cas, vérifiez que le casting reçoit un double ou non:
Juste pour les nombres positifs:
Vérification:
Production:
la source
Essaye ça:
Fonctionne également si votre chaîne $ contient des décimales
la source
Cela prendra également en charge le nombre négatif
la source
la source
J'ai conçu un moyen que je ne trouve nulle part, alors je le mets ici:
Sans plus tarder, c'est ceci:
ctype_digit((string) abs($input))
Exemple:
Résultats: (sont comme prévu, je suppose)
la source
Peut-être pas la façon la plus performante de le faire. Mais vous pouvez l'écrire en une seule ligne.
Comme prévu:
Je t'ai eu:
la source
Quelques années de retard, mais sur la base des réponses données ici, j'ai trouvé une solution légèrement plus précise (sur les booléens, en particulier) et plus efficace (je pense) que la plupart des autres réponses:
Travailler comme prévu pour ceux-ci:
Sauf peut-être pour ces 2:
la source
Que diriez-vous:
Cette fonction ne doit renvoyer true que pour tout numéro de chaîne pouvant être converti en int avec
(int)
ouintval()
sans rien perdre de signification mathématique (comme des non-zéros après la virgule décimale ou des nombres en dehors de la plage d'entiers de PHP) tout en acceptant des choses qui ne sont pas mathématiquement significatives (comme les espaces; les zéros non significatifs; ou, après la virgule décimale, les zéros exclusivement).Il renverra false pour
'10.'
mais pas pour'10.0'
. Si vous vouliez'10.'
être vrai, vous pouvez remplacer le+
suivant0
dans l'expression régulière par*
.la source
Voici un code que j'ai utilisé qui semble bien fonctionner et qui n'a aucun des problèmes que beaucoup d'autres font.
Il ne vérifie pas l'ordre, etc. donc pas destiné aux entiers négatifs, mais avec du code supplémentaire qui peut également être fait en utilisant certaines des autres idées ci-dessus. Il peut également être adapté pour fonctionner avec des binaires
array('0', '1')
ou des hexadécimaux, etc.la source
Regarde ça. Convertit $ val en entier, puis vérifie si le $ val d'origine converti en chaîne est IDENTIQUE (===) - juste == ne fonctionnera pas comme prévu - en entier val converti en chaîne.
Si vous ne vérifiez pas les valeurs de chaîne, cela risque de ne pas fonctionner comme prévu:
Production:
La raison étant que même si vous utilisez hex (0x101010), octal (01) ou un entier stocké comme float (1.0, 0.0), tous sont stockés en interne comme float. Cependant, si vous utilisez la fonction pour vérifier les int stockés sous forme de chaîne, cela fonctionnera.
la source
la source
Vous pouvez utiliser la condition suivante. Notez que vous ne devez pas utiliser! ==
la source
Cela fonctionne parfaitement! J'espère que cela vous sera utile =)
la source
Si vous voulez vraiment savoir si une chaîne est une représentation valide d'un vrai type entier PHP ...
Cependant, cela est impossible à exécuter car l'ensemble est trop grand (ne rentrera pas en mémoire dans ce cas, si vous bouclez à la place, cela prendra trop de cycles CPU).
Vous pouvez peut-être faire une recherche binaire avec comparaison de chaînes, mais il existe de meilleures façons.
Le plus simple étant:
Il existe d'autres façons inhabituelles de l'aborder, telles que:
Vous pouvez également faire des comparaisons de chaînes, mais vous devrez toujours faire des choses telles que ctype_digit, vérifier que la longueur est raisonnable (ne gaspillez pas le processeur avant de faire des choses comme ctype_digit) et avoir une gestion délicate pour les nombres négatifs.
Notez que filter_var n'affirme pas correctement qu'une chaîne est véritablement la représentation d'un entier PHP. Cela permettra un + au début et un espace blanc environnant.
En interne, PHP utilise la fonction "_zend_handle_numeric_str" pour une comparaison stricte mais elle ne l'expose pas directement n'importe où, d'où l'astuce en utilisant les clés de tableau (qui l'utilise pour convertir toute chaîne qui est une représentation d'un entier PHP en entier PHP).
Si vous voulez une conversion binaire sûre vers et depuis PHP, c'est l'approche à adopter.
Tout le monde ne voudra peut-être pas cela et cela pourrait être un cas de gestion des entrées utilisateur. filter_var n'est pas trop mal pour cela et sera assez sûr dans la plupart des cas pour les nouveaux utilisateurs de PHP.
Une vérification de longueur, ctype_digit, puis une vérification de la valeur convertie indiquant qu'elle est dans une plage est également assez solide pour la saisie de l'utilisateur. Des schémas plus complexes peuvent souhaiter un ajustement ou une expression régulière.
Le problème avec beaucoup de réponses ici à cet égard est que, même si la question est vague, les réponses ne devraient pas l'être. Si vous proposez une solution, vous devriez être en mesure d'expliquer exactement ce à quoi elle s'attendra et ce qu'elle n'attendra pas. Sans cela, il est impossible de dire si une réponse correspond à une question ou est sûre. Le manuel PHP n'aide pas toujours car il n'explique pas toutes les mises en garde pour chacune des méthodes pertinentes qu'il fournit. Des choses comme ctype_digit et is_int sont très fiables et faciles à préditer mais les spécificités de is_numeric, filter_var et jonglage (+ $ var) ou casting (intval / floatval) sont mal documentées.
C'est du fudge PHP pour vous. Il a une myriade de schémas pour interpréter les chaînes comme des entiers, avec des incohérences. La méthode la plus stricte de validation d'une chaîne entière n'est pas directement exposée à l'utilisateur.
la source
Si vous gérez les identifiants numériques de MySQL et essayez d'imposer une validation pour qu'il soit un non valide du zéro int ou un ,
int
mais sous forme de chaîne ( comme MySQL retourne toujours tout format de chaîne ) et nonNULL
. Vous pouvez utiliser ce qui suit. C'est le moyen le plus résistant aux erreurs / avertissements / avis de n'autoriser queint/string-ints
ce que j'ai trouvé.la source
Voici une solution simple qui utilise is_numeric , floatval et intval :
Résultats:
Notez que les valeurs supérieures à PHP_INT_MAX peuvent renvoyer false.
la source
Pourrait utiliser is_numeric () puis vérifier la présence de "." dans la chaîne (pas particulièrement sensible à la culture).
Vous pouvez également utiliser is_numeric () puis transtyper en double et voir si $ var == floor ($ var) (devrait retourner true si c'est un entier).
la source