2010-04-04 3 views
1

Je me demandais quel serait le meilleur moyen de valider un nombre entier. Je voudrais que cela fonctionne avec des cordes aussi bien, pour que je puisse à quelque chose commePHP validant les entiers

(string) 00003 -> (int) 3 (valide)

(string) -027 -> (int) -27 (valide)

(int) 33 -> (int) 33 (valide)

(string) '33a' -> (FAUX) (invalide)

C'est ce que je Va jusqu'à maintenant:

function parseInt($int){ 
    //If $int already is integer, return it 
    if(is_int($int)){return $int;} 
//If not, convert it to string 
$int=(string)$int; 
//If we have '+' or '-' at the beginning of the string, remove them 
$validate = ($int[0] === '-' || $int[0] === '+')?substr($int, 1):$int; 
//If $validate matches pattern 0-9 convert $int to integer and return it 
//otherwise return false 
return preg_match('/^[0-9]+$/', $validate)?(int)$int:FALSE; 
} 

Pour autant que j'ai testé, cette fonction fonctionne, mais cela ressemble à une solution de contournement maladroite.

Existe-t-il un meilleur moyen d'écrire ce genre de fonction. J'ai aussi essayé

filter_var($foo, FILTER_VALIDATE_INT); 

mais il n'accepter des valeurs comme '0003', '-0', etc.

Répondre

6

Vous pouvez essayer ctype_digit ou is_numeric

+0

Merci Je vais essayer de combiner ctype_digit ou is_numeric avec autre chose. Pas exactement ce que je cherchais, mais assez proche. – Mikk

2

il y a une fonction native appelée intval(). Est-ce que c'est ce que vous cherchez?

+1

Cela renvoie simplement la valeur de l'entrée sous la forme d'un nombre entier, elle n'effectue aucune validation. Les objets qui ne sont pas des entiers renverront 0. – davethegr8

1

il n'acceptera pas « 0003 » parce que ce n'est pas entier « clair ». Integer ne peut pas commencer par zéro mais peut être négatif (remarquez que vous supprimez '-' avec votre fonction). Comme dit avant moi, utilisez ctype_digit ou is_numeric

+0

En fait, '-' reste (parce que $ valide la valeur de get substr ($ int, 1) ou juste $ int, et (int) $ int est retourné), mes mauvais - probablement les commentaires dans mon code n'étaient pas assez clairs. – Mikk

0

Vous pouvez utiliser intval comme Jacob suggère.

Cependant, si vous voulez une classe de validation int Locale aware, alors je suggère d'utiliser le Zend FrameworkZend_Validate_Int validateur.

Utilisation

<?php 
$v = new Zend_Validate_Int(); 
if ($v->isValid($myVal)) { 
    // yay 
} else { 
    // fail 
} 

Notez que la structure en raison de pick-et choisir du Zend Framework, vous ne avez pas besoin de l'utiliser pour toute votre application. Les validateurs ont des dépendances minimales sur Zend_Locale, pour la validation des paramètres régionaux, et Zend_Registry.

0

Rapide et sale, je ne vais pas gérer '0003' autant que je sache.

function parseInt($in) { 
    return ($in == intval($in) ? $in : false); 
} 
0

Vous pouvez également utiliser le package Valar de PEAR; http://pear.php.net/manual/en/package.validate.validate.number.php

diverses options sont:

  1. décimal (mixte) - caractères décimaux ou faux lorsque décimal non autorisé. Par exemple ",." pour permettre à la fois "." et ",".
  2. dec_prec (int) - Nombre de décimales autorisées.
  3. min (float) - Valeur minimale.
  4. max (float) - Valeur maximale.