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

Langage PHP Discussion :

Formatage d'un nombre avec preg match [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Par défaut Formatage d'un nombre avec preg match
    Bonjour à vous,
    voilà, je suis débutant en php ( ), et je dois effectuer un contrôle sur un champ numérique d'un formulaire de saisie.
    L'utilisateur peut saisir un nombre qui ne doit pas dépasser 9999, mais qui peut comporter une virgule, ...ou pas! (le point doit être accepté, s'il se trompe par exemple).
    J'utilise une regex qui fonctionne relativement bien (pas de 0 en début, acceptation du point et de la virgule). Le souci provient de la longueur acceptable du nombre, que j'ai mis à 6 caractères.
    Ainsi: 1234,56 ou 1234.56 sont bien acceptés, mais de fait 123456 aussi, alors qu'il ne faut pas (limitation à 9999).
    Je ne souhaite pas indiquer à l'utilisateur qu'il faut taper xxxx,00 pour un nombre entier à 4 chiffres qui ne comporterait pas de décimales.
    J'espère que je suis clair!
    Est-ce que l'un(e) d'entre vous aurait une solution à cette question?
    En vous en remerciant par avance, cordialement

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 330
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 330
    Billets dans le blog
    17
    Par défaut
    Montre ta regexp pour qu'on puisse te corriger.

  3. #3
    Invité de passage
    Inscrit en
    Octobre 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 1
    Par défaut
    Bonjour,

    Peut-être ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^[0-9][.0-9]?[.0-9]?[0-9]?$
    @+

    ou ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "^[0-9][0-9]?[0-9]?[0-9]?$|^[0-9][0-9]?[0-9]?[0-9]?\.\d\d?$"
    @+

    Voici une regex plus digeste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "^\d\d?\d?\d?$|^\d\d?\d?\d?\.\d\d?$"


    @+

  4. #4
    Futur Membre du Club
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Par défaut Regex et preg_match
    Bonsoir les gars,
    merci pour vos réponses, hélàs ça ne fonctionne pas toujours correctement.
    Voilà l'expression que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elseif(!preg_match(('#^[1-9]{1}+[0-9,.]{1,6}$#'),($_POST['montant_aci'])))
    Comme j'essayais d'expliquer, elle prend: 2345,98 ou 2345.98, 2345,00 mais hélas aussi: 123456, or, il faudrait ne pas dépasser 9999 (quand on doit écrire un nombre de 4 chiffres sans chiffres après la virgule).

    Je vous remercie bien pour vos recherches
    Amitiés

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Question bête : si c'est un nombre, pourquoi ne pas le convertir en nombre et faire une comparaison avec 9999 ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Par défaut Regex et preg_match
    Bonsoir Celira et vous tous,
    merci pour vos réponses.
    En fait, j'ai bien pensé par exemple utiliser une fonction qui pourrait récupérer la partie entière du nombre, mais, alors que je connais en maths, par contre, en php, je ne sais pas faire.
    Merci par avance pour votre aide
    Cordiales salutations

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Le décimal est symbolisé par un point en php et non par une virgule. On pourrait donc faire un truc dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $montant = str_replace(',','.',$_POST['montant_aci']);
     
    // on teste ensuite si le résultat est numérique et inférieur ou égal à 9999
    $verif = is_numeric($montant) && $montant <= 9999 ? true : false;
     
    if($verif)
    {
    //on peut utiliser $montant
    }
    else
    {
    //message d'alerte
    }

  8. #8
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 330
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 330
    Billets dans le blog
    17
    Par défaut
    is_numeric( ) ne convient pas car :

    Les chaînes numériques sont composées optionnellement de signes, de n'importe quel nombre de chiffres, optionnellement d'une partie décimale ainsi qu'une partie exponentielle. +0123.45e6 est une valeur numérique valide. Les notations hexadécimale (i.e. 0xf4c3b00c), binaire (i.e. 0b10100111001), octale (i.e. 0777) sont également autorisées, mais uniquement sans le signe, sans décimale et sans partie exponentielle.
    http://www.php.net/manual/fr/function.is-numeric.php

  9. #9
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour

    @ABCIWEB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $verif = is_numeric($montant) && $montant <= 9999 ? true : false;
    se résume en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $verif = (is_numeric($montant) && ($montant <= 9999));
    Ceci devrait faire l'affaire :
    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
     
    <?php
     
    $check_number =
        function($p)
        {
            return (ctype_digit(str_replace(array(',', '.'), '', $p))
                   && (floatval(str_replace(',', '.', $p)) < 10000));
        };
     
    $a = $check_number('2345,98');          // true
    $b = $check_number('2345.98');          // true
    $c = $check_number('123456');           // false
    $d = $check_number('0xf4c3b00c');       // false
    $e = $check_number('0b10100111001');    // false
     
    ?>

  10. #10
    Futur Membre du Club
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Par défaut regex et preg_match
    Parfait !
    Je te remercie bien rawsrc, et également vous tous pour votre contribution; à une prochaine très certainement

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

Discussions similaires

  1. Formatage d'un nombre avec 2 décimales
    Par anibaldeveloppment dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/10/2013, 15h41
  2. [XSLT] formatage d'un nombre avec exposant
    Par menakikou dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 21/12/2010, 22h52
  3. Formatage de nombre avec leading 0
    Par ulmeen dans le forum Développement
    Réponses: 3
    Dernier message: 15/04/2009, 14h28
  4. [Format]nombres avec des 0
    Par zozolh2 dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 01/06/2004, 08h43

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