Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Form
Zend_Form Forum d'entraide pour le composant Zend_Form du Zend Framework (création de formulaires, helpers, AJAX etc.). Avant de poster -> FAQ Zend_Form.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/04/2008, 07h51   #1
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
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 ?
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 09h33   #2
Membre éclairé
 
Avatar de nicocsgamer
 
Inscription : mars 2005
Messages : 324
Détails du profil
Informations personnelles :
Âge : 27
Localisation : Luxembourg

Informations forums :
Inscription : mars 2005
Messages : 324
Points : 365
Points : 365
Envoyer un message via MSN à nicocsgamer
http://www.regular-expressions.info/floatingpoint.html
nicocsgamer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 10h56   #3
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
Voilà ce que je test :
Code :
->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 :
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 :
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 ?
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 12h00   #4
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
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) ?
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 12h21   #5
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
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 ?
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 12h45   #6
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
Citation:
Envoyé par whitespirit Voir le message
et voilà mon message d'erreur :
Code :
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
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 13h15   #7
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
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 ?
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 15h51   #8
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
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...
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 16h07   #9
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
Rebonjour,

en fait, il faut encadrer ton expression par des délimiteurs de pattern (exemple : slash) :
Code :
->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 :
->addValidator(new Zend_Validate_Regex('/^[-+]?[0-9]*\.?[0-9]{0,2}$/'),true, array('messages'=>'Entrer un format monétaire 0.00'))
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 18h44   #10
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
Hey, c'est trop merveilleux. Ca marche.

Pourtant je vais faire la fine bouche, le message d'erreur est
Code :
'f' does not match against pattern '/^[-+]?[0-9]*\.?[0-9]{0,2}$/'
. Dans le code de ce validateur, j'ai :
Code :
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 ?
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 19h19   #11
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
Voir le manuel du framework :
http://framework.zend.com/manual/fr/...ction.messages
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2008, 07h29   #12
Membre habitué
 
Inscription : septembre 2007
Messages : 357
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 357
Points : 118
Points : 118
Purée, tu es très fort !!!! Oui, j'avais raté ce passage dans la doc.

Voilà comment est créé mon validateur final :
Code :
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.
whitespirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2008, 09h29   #13
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
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
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h08.


 
 
 
 
Partenaires

Hébergement Web