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

JavaScript Discussion :

Formater un nombre avec une expression régulière (1234567 => 1 234 567)


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 183
    Par défaut Formater un nombre avec une expression régulière (1234567 => 1 234 567)
    En gros je vais essayer d'expliquer comment écrire la regexp utilisée dans la ligne ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numberStr.replace(/(\d)(?=(\d{3})+$)/g, '$1 ');
    Le but ici est de récupérer les nombres par groupe de 3 et de les séparer par un espace.
    ex : 1234567 => 1 234 567
    Les différents formatages possibles sont :
    X
    XX
    XXX
    X XXX
    XX XXX
    XXX XXX
    X XXX XXX
    XX XXX XXX

    etc…


    Cette liste va nous permettre de mieux réfléchir à la construction de l'expression régulière.

    Les outils :
    Parmi les outils dont nous disposons :
    - String.replace
    - Les groupes de capture
    - les variables prédéfinies : $1…$9, elles contiennent la valeur du groupe de capture récupéré.

    Ajout de l'espace :
    Le premier test consiste à rajouter un espace après un chiffre.

    // On déclare le fichier dans la RegExp :
    // on veut tous les chiffres, on rajoute le flat "g" pour global
    // on le capture car on aura besoin de le réutiliser dans la chaine de remplacement
    // on utilise String.replace, en utilisant $1 et en mettant un espace après $1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "1234".replace(/(\d)/g, '$1 ');
    // resultat :
    Ajout de l'espace entre chaque groupe de 3 chiffres
    Maintenant c'est là que c'est plus compliqué, car le but est de rajouter un espace tous les 3 chiffres, mais en répondant au critère de formatage de la liste définie plus haut.

    // on rajoute un espace après 3 chiffres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    "123456".replace(/(\d{3})/g,"$1 ");
    > 123 456 //OK
     
    "1234567".replace(/(\d{3})/g,"$1 ");
    > "123 456 7" //NOK
    Il faut donc penser différemment pour écrire la regexp. Dans notre cas de formatage de nombre il suffit de se dire :
    "Il faut rajouter un espace après chaque chiffre qui est forcément suivi par N groupe de 3 chiffres".
    Exemple :
    1234567 => on va rajouter un espace après le 1 car il est suivi du groupe 234 et 567, et on va rajouter un espace après le 4, car il est suivi de 567
    12345678 => on va rajouter un espace apres le 2 car il est suivi du groupe 345 et 678, et on va rajouter un espace après le 5, car il est suivi de 678
    On remarquera alors que "12" sont bien séparés des autres groupes
    Donc 12345678 => 12 345 678.

    Si vous me suivez jusque là on peut attaquer la regexp finale

    Ecriture de la regexp finale :
    On reprend notre regexp précédente :
    On rajoute la règle qui veut que le chiffre soit toujours avant un groupe de 3 chiffres
    Sauf qu'il faut clairement indiquer que le groupe de 3 chiffres est toujours situé à la fin, on rajoute donc $
    Pour le moment ça ne marche qu'avec un seul groupe de 3 chiffres, il faut rajouter un + pour indiquer qu'on aura 1 ou plusieurs groupe de 3 chiffres
    Il y a cependant un problème, la regexp est écrite de manière à capturer toute la chaîne, du coup, malgré le flag "g", la regexp ne boucle qu'une seule fois..
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > "12343222".replace(/(\d)(\d{3})+$/g, '$1 ')
    => "12 "
    Il faut donc indiquer qu'on ne capture pas le deuxième terme, mais qu'on l'utilise pour indiquer que notre chiffre est toujours suivi par des groupes de 3 chiffres. On l'indique en utilisant ?=
    Maintenant il ne reste plus qu'à utiliser la regexp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var formattedNumber = number.replace(/(\d)(?=(\d{3})+$)/g, '$1 ');

    PS : ce n'est pas parfait, mais si vous avez des questions, je suis preneur, ça me permettra d'expliquer plus clairement.

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var num="1234567895"
    tabnum=num.split('').reverse().join('').match(/\d{1,3}/g)
    tabnum=tabnum.join(' ').split('').reverse().join('')
    alert(tabnum)
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 183
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var num="1234567895"
    tabnum=num.split('').reverse().join('').match(/\d{1,3}/g)
    tabnum=tabnum.join(' ').split('').reverse().join('')
    alert(tabnum)
    L'idée ici n'est pas d'apporter une solution au problème mais d'expliquer la construction d'une expression regulière

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    l'idée ici n'est pas d'apporter une solution au problème, mais de montrer une alternative plus simple .
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 183
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    l'idée ici n'est pas d'apporter une solution au problème, mais de montrer une alternative plus simple .
    plus simple... 3 splits, 2 join, 2 reverse, 1 match...

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    sujet également traité ici ...
    http://javascript.developpez.com/faq...egExpMonetaire

    essaye de benchmarker les deux, je pense que ta version est plus gourmande
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

Discussions similaires

  1. [FAQ] Comment tester une chaîne de caractères avec une expression régulière ?
    Par Baptiste Wicht dans le forum Vos Contributions VBScript
    Réponses: 1
    Dernier message: 20/11/2007, 19h43
  2. Problème avec une expression régulière ?
    Par MaTHieU_ dans le forum Delphi
    Réponses: 1
    Dernier message: 28/04/2007, 18h50
  3. [RegEx] problème avec une expression régulière
    Par sissi25 dans le forum Langage
    Réponses: 2
    Dernier message: 19/04/2007, 09h12
  4. [JMeter] Extraction avec une expression régulière
    Par LittleBean dans le forum Tests et Performance
    Réponses: 0
    Dernier message: 04/04/2007, 17h39
  5. Problème avec une expression régulière
    Par Darkroro dans le forum Langage
    Réponses: 7
    Dernier message: 09/10/2006, 12h13

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