comment tester si une variable est un entier numérique ???

comment tester si une variable est un entier numérique ??? - PHP - Programmation

Marsh Posté le 14-11-2005 à 01:14:43    

bonjour,
 
j'ai un bete probleme :  
 
quand je teste le type d'une variable récupérée en post depuis un formulaire (avec un gettype()), elle est toujours de type string... meme si ce sont des chiffres qui ont été enntrés dans le formulaire, comme un N° de telephone par exemple (sans espace  ni rien).
 
Comment donc tester si cette variable est (ou n'est pas) un chiffre entier ???
 
merci de votre aide  :)

Reply

Marsh Posté le 14-11-2005 à 01:14:43   

Reply

Marsh Posté le 14-11-2005 à 02:12:14    

isnumeric ?
 
http://fr.php.net/tafonction
 
 ou sinon rechercher un peu sur google

Reply

Marsh Posté le 14-11-2005 à 09:41:41    

je ne poserais pas la question ici si je n'avais pas d'abord cherché sur gougueul ;)
 
Justement, le isnumeric donne toujours ub false, je viens d'expliquer qu'un champ input txt renvoie toujours une chaine string. Mon pb est de pouvoir detecter si cette chaine contient des données numériques ou non puisque le type n'ets plus utilisable pour ce test ...  
 
 
Any idea ?

Reply

Marsh Posté le 14-11-2005 à 09:55:32    

en cherchant sur le manuel de PHP :  

Citation :


Conversion de chaînes de caractères
Lorsqu'une chaîne de caractères est évaluée comme une valeur numérique, le résultat et le type de la variable sont déterminés comme suit.  
 
La chaîne de caractères est de type "double" si elle contient un des caractères '.', 'e' ou 'E'. Sinon, elle est de type entier ("integer" ).  
 
La valeur est définie par la première partie de la chaîne. Si la chaîne de caractères débute par une valeur numérique cette valeur sera celle utilisée. Sinon, la valeur sera égale à 0 (zéro). Les données numériques valides ont un signe optionel, suivies par un ou plusieurs digits (optionnellement, contenant un point de décimal), sivies par un exponentiel optionnel. L'exponentiel peut être un 'e' ou un 'E' suivi par un ou plusieurs digits.  
 
Exemple 11-19. Exemples de conversions automatiques

Code :
  1. <?php
  2. $foo = 1 + "10.5";                // $foo est du type  float (11.5)
  3. $foo = 1 + "-1.3e3";              // $foo est du type  float (-1299)
  4. $foo = 1 + "bob-1.3e3";          // $foo est du type  integer (1)
  5. $foo = 1 + "bob3";                // $foo est du type  integer (1)
  6. $foo = 1 + "10 petits cochons";      // $foo est du type  integer (11)
  7. $foo = 4 + "10.2 gros cochons"; // $foo est du type  float (14.2)
  8. $foo = "10.0 cochons " + 1;          // $foo est du type  float (11)
  9. $foo = "10.0 cochons " + 1.0;        // $foo est du type  float (11)
  10. ?>



Reply

Marsh Posté le 14-11-2005 à 10:33:26    

:hello:  
Il y a longtemps de cela, j'avais récupéré la fonction suivante sur un site, dont je ne me souviens plus de l'adresse. D'après son auteur, dont je ne me rappelle plus du nom, cette fonction est meilleur que le simple is_numeric. Je l'emploie souvent et elle me donne satisfaction.

Code :
  1. // Test if a field contains an integer value. Returns true or false
  2. function myIsInt($x) {
  3.    return(is_numeric($x) ? intval(0+$x) == $x : false);
  4. }

:)

Reply

Marsh Posté le 14-11-2005 à 10:34:40    

olivthill a écrit :

:hello:  
Il y a longtemps de cela, j'avais récupéré la fonction suivante sur un site, dont je ne me souviens plus de l'adresse. D'après son auteur, dont je ne me rappelle plus du nom, cette fonction est meilleur que le simple is_numeric. Je l'emploie souvent et elle me donne satisfaction.

Code :
  1. // Test if a field contains an integer value. Returns true or false
  2. function myIsInt($x) {
  3.    return(is_numeric($x) ? intval(0+$x) == $x : false);
  4. }

:)


elle reprend le is_numeric ta fonction hein  [:columbo2]


---------------
Saint Seiya  || La Livebox || Europe, débats, réflexions
Reply

Marsh Posté le 14-11-2005 à 10:44:19    

La valeur ajoutée de ma fonction réside dans le test de intval(0+$x) == $x . Cela permet de savoir si la valeur, que l'on sait déjà être numérique par le précédent test is_numeric, est un entier ou non. Il ne s'agit pas seulement de savoir si une donnée est numérique, mais aussi si elle est un entier.

Reply

Marsh Posté le 14-11-2005 à 10:51:03    

arrrggggHhhh ! je ne dois pas etre explicite...
 
Mon pb n'est pas de tester le type de la variable, elle est TOUJOURS de type STRING quand je la récupère en post depuis un formulaire.  
 
Comment voir si une variable de type string contient des données numériques ?
 
Testez, faites un mini formulaire :

Code :
  1. <form action="test.php" method="post">
  2. <input type="text" name="telephone" />
  3. <form>


 
Ensuite récupérez la variable $_POST['telephone'] sur une page test.php, et testez son type :

Code :
  1. echo gettype($_POST['telephone'])


 
et ca va vous donner "string", meme si la chaine est 0145673456 ...
 
DONC : question (la bonne !!) : comment tester si $_POST['telephone']  contient des chiffres et pas de lettres ?!!!
 
:)

Message cité 1 fois
Message édité par jerkeve le 14-11-2005 à 10:55:12
Reply

Marsh Posté le 14-11-2005 à 10:56:58    

jerkeve a écrit :


DONC : question (la bonne !!) : comment tester si $_POST['telephone']  contient des chiffres et pas de lettres ?!!!


 
Avec is_numeric. Essaye encore.  [:spamafote]  
 
Elle est faite pour ça.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 14-11-2005 à 11:20:45    

Désolé sielfried, mais un nombre testé avec is_numeric peut contenir la lettre E. La question est de trouver un nombre entier, pas un nombre flottant. Donc is_numeric ne suffit pas.
 
Il faut faire :

function myIsInt($x) {  
   return(is_numeric($x) ? intval(0+$x) == $x : false);  
}
...
if (myIsInt($_post['telephone']) == false)
   print("Erreur, numéro de téléphone non numérique" );


Reply

Marsh Posté le 14-11-2005 à 11:20:45   

Reply

Marsh Posté le 14-11-2005 à 11:34:22    

:hello:  
 
En fait j'ai trouvé : ce sont les espaces saisis en début ou en milieu de chaine qui cagouillent le resultat. les gens saisissent souvent leurs telephones au format 01 34 56 67 78 par ex.  
 
Donc pour schunter il suffit de tester comme ca (pas leger mais efficace) :

Code :
  1. if(is_numeric(trim(str_replace(" ","",$_POST['teleplone']))))  { echo 'chiffre'; } else { echo 'lettre'; }


 
par contre ta fonction est effectivement interessante, olivthill, pour bloquer les virgules en plus.  
 
 
 
MERCI de vos aides et reponses  :jap:


Message édité par jerkeve le 14-11-2005 à 11:35:37
Reply

Marsh Posté le 14-11-2005 à 13:24:39    

olivthill a écrit :

Désolé sielfried, mais un nombre testé avec is_numeric peut contenir la lettre E. La question est de trouver un nombre entier, pas un nombre flottant. Donc is_numeric ne suffit pas.


 
Ouais, le "Comment voir si une variable de type string contient des données numériques ?" m'a fait oublier qu'il voulait des entiers spécifiquement. Reste que c'était pas normal qu'is_numeric lui balance false.
 
Sinon un petit preg_match('#^[\d\s]*$#', $texte) et pis valà.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 14-11-2005 à 14:45:19    

ouais, je suis une quiche en regex, donc pas cap de le faire, mais je pensais que c'était une idée ;)


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 14-11-2005 à 14:47:51    

moi je n'aime pas trop les regex non plus : ca mange pas mal de cpu ces petites betes, donc quand je peux eviter... ;)
C'est pour ca que je cherchais autre chose ...

Reply

Marsh Posté le 16-11-2005 à 11:32:28    

Pas du tout, et au contraire, les regexp ca s'avère plus rapide que du code mal branlé ou bidouillé

Reply

Marsh Posté le 19-11-2005 à 18:24:21    

ca devrait faire l'affaire :
 

Code :
  1. if(ereg("([a-zA-Z])",$ta_variable_postee))
  2. {
  3. action();
  4. }


---------------
Réagissez et commentez mes dessins sur snut.fr
Reply

Marsh Posté le 20-11-2005 à 15:28:56    

oui, merci, effectivement il n'y a pas d'autre solution simple que les regex :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed