IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Form PHP Discussion :

Comment valider un type monétaire (Regex) ?


Sujet :

Zend_Form PHP

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut Comment valider un type monétaire (Regex) ?
    Bonjour,

    Je ne vois pas comment pourrais-je combiner les validateurs pour tester un type monétaire. Par exemple 5 ou 19,50 ?

    Avez-vous une idée ?

  2. #2
    Membre averti Avatar de nicocsgamer
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 321
    Points : 342
    Points
    342

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    Voilà ce que je test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->addValidator(new Zend_Validate_Regex('^[-+]?[0-9]*\.?[0-9]+$'),true, array('messages'=>'Entrer un format monétaire 0.00'))
    et voilà mon message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Internal error matching pattern '^[-+]?[0-9]*\,?[0-9]+$' against value '1.00'
    C:\wamp\www\location\library\Zend\Validate\Regex.php à la ligne 116
    Et voici ce qu'on trouve à la ligne 116
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public function isValid($value)
        {
            $valueString = (string) $value;
     
            $this->_setValue($valueString);
     
            $status = @preg_match($this->_pattern, $valueString);
            if (false === $status) {
                /**
                 * @see Zend_Validate_Exception
                 */
                require_once 'Zend/Validate/Exception.php';
                throw new Zend_Validate_Exception("Internal error matching pattern '$this->_pattern' against value '$valueString'");
            }
            if (!$status) {
                $this->_error();
                return false;
            }
            return true;
        }
    J'utilise la version 1.5.0 et je ne vois pas pourquoi mettre if (false === $status) avec 3 === ?

    Je ne suis pas habitué à utiliser les expressions régulières, peut-être que l'erreur est logique ?

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    les === signifient que les valeurs testées doivent être égales ET de même type (donc pas de conversion). Cela permet d'être sûr que $status a renvoyé false, et pas une valeur pouvant être convertie en false (comme 0).

    Dans ce que tu postes, il y a quelque chose que je ne comprend pas : est-tu bien sûr de tester l'expression régulière '^[-+]?[0-9]*\.?[0-9]+$' et pas '^[-+]?[0-9]*\,?[0-9]+$' comme indiqué dans le message d'erreur, et qui explique pourquoi 1.00 n'est pas conforme (test de la virgule et pas du point) ?

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    J'applique l'expression régulière bien sur un '.', et le message d'erreur le montre bien. Par contre, je ne vois pas pourquoi j'entre dans le if=== car au pire, mon expression n'est pas conforme, non ?

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par whitespirit Voir le message
    et voilà mon message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Internal error matching pattern '^[-+]?[0-9]*\,?[0-9]+$' against value '1.00'
    C:\wamp\www\location\library\Zend\Validate\Regex.php à la ligne 116
    Moi, je vois une virgule, et pas un point

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    Ha oui, en fait, c'est que j'ai fais plusieurs test, avec la virgule, le point. Mais quoi qu'il en soit, j'ai toujours le même message d'erreur.

    Mais sur le principe, tu n'es pas d'accord que c'est bien le but du validateur de déterminer ou non si l'élément qui lui est fournit est au bon format et traiter l'erreur ?

  8. #8
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par whitespirit Voir le message
    Ha oui, en fait, c'est que j'ai fais plusieurs test, avec la virgule, le point. Mais quoi qu'il en soit, j'ai toujours le même message d'erreur.

    Mais sur le principe, tu n'es pas d'accord que c'est bien le but du validateur de déterminer ou non si l'élément qui lui est fournit est au bon format et traiter l'erreur ?
    Au temps pour moi, je n'avais pas assez bien regardé, ce n'est en effet pas normal. En fait, c'est que ton expression régulière n'est pas reconnue, et que la fonction php preg_match rencontre une erreur (c'est pour ça qu'elle renvoie false)...

    Je vais essayer de regarder pourquoi...

  9. #9
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Rebonjour,

    en fait, il faut encadrer ton expression par des délimiteurs de pattern (exemple : slash) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->addValidator(new Zend_Validate_Regex('/^[-+]?[0-9]*\.?[0-9]+$/'),true, array('messages'=>'Entrer un format monétaire 0.00'))
    Et si tu veux limiter le nombre de décimales à 2 (en fait, 0, 1 ou 2) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->addValidator(new Zend_Validate_Regex('/^[-+]?[0-9]*\.?[0-9]{0,2}$/'),true, array('messages'=>'Entrer un format monétaire 0.00'))

  10. #10
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    Hey, c'est trop merveilleux. Ca marche.

    Pourtant je vais faire la fine bouche, le message d'erreur est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'f' does not match against pattern '/^[-+]?[0-9]*\.?[0-9]{0,2}$/'
    . Dans le code de ce validateur, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    const NOT_MATCH = 'regexNotMatch';
    protected $_messageTemplates = array(
            self::NOT_MATCH => "'%value%' does not match against pattern '%pattern%'"
        );
    Je ne trouve pas comment récupérer ce message et le mettre à ma sauce. Une idée peut-être ?

  11. #11
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344

  12. #12
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    Purée, tu es très fort !!!! Oui, j'avais raté ce passage dans la doc.

    Voilà comment est créé mon validateur final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $validator = new Zend_Validate_Regex('/^[-+]?[0-9]*\.?[0-9]{0,2}$/');     
            $validator->setMessage("La chaîne '%value%' n'est pas au format attendue, veuillez entrer par exemple 1.00",  Zend_Validate_Regex::NOT_MATCH);
    Encore merci. N'empêche que je me demande comment tu as trouvé qu'il fallait mettre les '/' avant et après l'expression régulière.

  13. #13
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par whitespirit Voir le message
    Encore merci.
    de rien
    Citation Envoyé par whitespirit Voir le message
    N'empêche que je me demande comment tu as trouvé qu'il fallait mettre les '/' avant et après l'expression régulière.
    En consultant la doc de php
    http://www.php.net/manual/fr/intro.pcre.php

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/05/2006, 11h11
  2. Réponses: 10
    Dernier message: 18/11/2003, 18h01
  3. Comment detecter le type d'un objet?
    Par nickylarson dans le forum C++Builder
    Réponses: 3
    Dernier message: 24/06/2003, 15h23
  4. Comment définir le type matrice ?
    Par charly dans le forum Langage
    Réponses: 7
    Dernier message: 15/06/2002, 21h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo