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

JavaScript Discussion :

Calcul dans une String


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2003
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2003
    Messages : 37
    Points : 38
    Points
    38
    Par défaut Calcul dans une String
    Bonjour,
    J'ai une variable du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    100 brebis galeuse. 5 moutons oranges. 3 vaches bleues.
    Je dois faire un calcul identique pour tous les chiffres. Quel est le meilleur moyen? Dois je décomposer dans un premier temps la variable ?
    Mon résultats dois être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    800 brebis galeuse. 40 moutons oranges. 24 vaches bleues.

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 057
    Points : 44 589
    Points
    44 589
    Par défaut
    Bonjour,
    Dois je décomposer dans un premier temps la variable ?
    Exactement, c'est la première chose à faire avant tout calcul.

  3. #3
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 091
    Points : 16 645
    Points
    16 645
    Par défaut
    Salut

    Code HTML : 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <html lang="fr"> <!-- BaseModel.html -->
    	<head>
    		<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    		<title>Ici mon titre</title>
     
    		<style>
                            /* TAGs comentaire dans la partie style */
                    </style>
     
    		<script>
                            'use strict'; // force la déclaration des variables
                            function Calcul(quoi,multiplicateur) {
                                    let LeStr = quoi;
                                    const multi = multiplicateur;
                                    let LesStrt = LeStr.split(" ");
                                    LeStr = "";
                                    for (let i = 0; i< LesStrt.length; i++) {
                                            if (isNaN(LesStrt[i])){
                                                    LeStr  += LesStrt[i]+ " ";
                                                    }else{
                                                    LeStr += Number(LesStrt[i] * multi) + " ";
                                            }
                                    }
                                    document.getElementById("visualise").innerHTML = LeStr;
                            }//----------------------fin de la function model -----------------------------------
                            
                    </script>
    	</head>
    	<body>
    		<button onclick='Calcul("100 brebis galeuse. 5 moutons oranges. 3 vaches bleues.",8);'>Go exemple 1</button>
    		<button onclick='Calcul("10 tortues. 9 Lapins. 7 poissons pas rouges.", 16);'>Go exemple 2</button>
    		<div id="visualise"></div>
     
    	</body>
    </html>
    Il y a sûrement mieux.

  4. #4
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 886
    Points : 3 725
    Points
    3 725
    Par défaut
    Ah oui diviser avec l’espace comme séparateur et tester à chaque fois si on a un nombre ou pas me parait bien...

    Après si la string est toujours régulière j'avais pensé diviser par avec le point, ensuite diviser chaque résultat par l'espace et alors le premier élément de chaque résultat contient le chiffre à multiplier...

  5. #5
    Invité
    Invité(e)
    Par défaut
    bj,

    un peu plus concis : )
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var s = '100 brebis galeuse. 5 moutons oranges. 3 vaches bleues.'
    console.log(s.replace(/\d+/g, el=>el*8))
    output:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    800 brebis galeuse. 40 moutons oranges. 24 vaches bleues.

  6. #6
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 886
    Points : 3 725
    Points
    3 725
    Par défaut
    Ah oui bien vu !

  7. #7
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Erreur dans le message.

  8. #8
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 091
    Points : 16 645
    Points
    16 645
    Par défaut
    Salut

    Chez moi la réponse de galerien69 donne le bon résultat.

  9. #9
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 886
    Points : 3 725
    Points
    3 725
    Par défaut
    Ben j'ai testé ici : https://jsbin.com/hovolucejo/edit?js,console
    et on obtient : "800 brebis galeuse. 40 moutons oranges. 24 vaches bleues."

  10. #10
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    En effet. Me suis trompé.

  11. #11
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 057
    Points : 44 589
    Points
    44 589
    Par défaut
    Le passage par une regExp est tentant mais donnera de faux résultats en l'état actuel !
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var txt = "5 Tee-shirt taille 3. 5 Ampoules 25W. 5 moutons.";

  12. #12
    Invité
    Invité(e)
    Par défaut
    hi nosmoking,

    ici on peut s'en sortir en disant que seuls les nombres non suivis de majuscules sont à multiplier.
    on remanque __en revanche__ que les nombres décimaux ne sont pas reconnus.
    mais apres il faut savoir ce que on peut avoir en entrée, sinon on s'en sortira jamais (ou alors avec quelques cheveux en moins )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var s = "5 Tee-shirt taille 3. 2.5 Ampoules 25W. 5 moutons 3A.";
    console.log(s.replace(/\d+(?![A-Z]|\d)/g, el=>el*8))
    output:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    40 Tee-shirt taille 24. 16.40 Ampoules 25W. 40 moutons 3A.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    je suis curieux de savoir qui a la formule de galerien69, qui répond parfaitement à la problématique exposée.



    N.B. C'est le genre de réponse que j'avais aussi en tête, avant de voir qu'elle avait été proposée.
    Sauf que je n'avais pas la syntaxe el=>el*8... qui est différente du PHP... et que je n'ai pas trouvée (??)
    Dernière modification par Invité ; 08/10/2018 à 22h30.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Hello jreaux62

    La syntaxe a pour nom fat arrow. Cest juste (ici) du sucre syntaxique pour la forme function(el){return el*8}

    Ya des propriétés sympatiques avec this (je pense que c'est plutot pour ça qu'elle a été créée) mais bon...pour un oneliner, faut bien se faire plaisir

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2003
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2003
    Messages : 37
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par galerien69 Voir le message
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var s = '100 brebis galeuse. 5 moutons oranges. 3 vaches bleues.'
    console.log(s.replace(/\d+/g, el=>el*8))
    Merci bcp
    J'étais bien parti sur du replace.
    Solution rapide qui fonctionne très bien, est ce que j'ai la possibilité de ne pas prendre en compte la valeur 1. Si >= 2 on remplace.

  16. #16
    Invité
    Invité(e)
    Par défaut
    hi Makinator,

    même chose (t'aurais pu t'en sortir tu as décrit la règle toi même)
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var s = '1 brebis galeuse. 5 moutons oranges. 3 vaches bleues.'
    console.log(s.replace(/\d+/g, el=>el>1?el*8:el))

    output
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    1 brebis galeuse. 40 moutons oranges. 24 vaches bleues.

  17. #17
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 057
    Points : 44 589
    Points
    44 589
    Par défaut
    Pour moi la solution la plus aboutie reste celle proposée par ProgElecT, à laquelle je ferais quelques aménagements mineurs (voir code ci-après).

    La plus concise est incontestablement celle utilisant les rexExp, formulée en ES6 ou non, mais avec les contraintes déjà exposées comme par exemple :
    • pas de chiffre dans le texte
    • pas de nombre avec décimale
    Je reste persuadé que cela doit être faisable, mais ne comptait pas sur moi pour vous la réaliser avec mon niveau regExp 1 sur une échelle de 1 à 10.

    La version « ProgElecT » que j'aurais écrite.
    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
    21
    22
    23
    24
    function calcul(quoi, multi) {
      console.log("Entrée : ", quoi);
      multi = multi || 1;
      var sep = ". ";
      var tabTmp;
      // décomposition en sous chaine
      var lesStrt = quoi.split(sep);
      var i;
      var nb = lesStrt.length;
      for (i = 0; i < nb; i += 1) {
        // décomposition en sous sous chaine
        tabTmp = lesStrt[i].split(" ");
        console.log(i, "->", tabTmp);
        // test et traitement de la valeur du 1st indice
        // nota: ne pas utiliser Number.isNaN sous cette forme
        if (!isNaN(tabTmp[0])) {
          tabTmp[0] *= multi;
        }
        // reconstruction sous chaine
        lesStrt[i] = tabTmp.join(" ");
      }
      // affichage chaine compléte, mieux faire un return de la valeur
      document.getElementById("visualise").textContent = lesStrt.join(sep);
    }
    Nota : vous pouvez mettre des let en lieu et place de var si vous n'avez pas de navigateur IE a supporter


    Le principal étant que Makinator trouve la réponse à son besoin qui ne m'apparaît pas très clairement à la lecture de ses deux discussions sur le même thème.

  18. #18
    Invité
    Invité(e)
    Par défaut
    @NoSmoking

    1- OK, ça correspond à TA contrainte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var txt = "5 Tee-shirt taille 3. 5 Ampoules 25W. 5 moutons.";
    Avec var sep = ". ";, ça marche effectivement.

    2- Mais si on met des virgules (ou des tirets, ou autre), ça ne fonctionne plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var txt = "5 Tee-shirt taille 3, 5 Ampoules 25W, 5 moutons.";
    3- Donc là encore, il est ESSENTIEL de définir CLAIREMENT la STRUCTURE des données à traiter.


    @galerien69
    Merci ! J'aurais appris quelque chose : Fonctions fléchées
    Dernière modification par Invité ; 09/10/2018 à 12h22.

  19. #19
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 885
    Points : 6 620
    Points
    6 620
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    • pas de chiffre dans le texte
    • pas de nombre avec décimale
    Avec ES6, on peut désormais utiliser des tests arrière (lookbehinds) dans les patterns, donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    txt = txt.replace(/(?<!\S)(?:[2-9]\d*|1\d+)(?!\S)/g, m => m*8);
    (?<!\S): non précédé d'un caractère qui n'est pas un caractère blanc = précédé d'un caractère blanc ou au début de la chaîne.
    (?!\S): non suivi d'un caractère qui n'est pas un caractère blanc = suivi d'un caractère blanc ou de la fin de la chaîne.

    [2-9]\d*|1\d+ suffit à remplir la condition n>1. On pourrait aussi écrire (?:[2-9]|1\d)\d*.

  20. #20
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 057
    Points : 44 589
    Points
    44 589
    Par défaut
    @jreaux62 :
    1- OK, ça correspond à TA contrainte :
    Non cela correspond à ma lecture du besoin client qui est je te l'accorde bien light dans le cas présent.

    2- Mais si on met des virgules (ou des tirets, ou autre), ça ne fonctionne plus :
    Il suffit simplement pour plus de portabilité de passer en paramètre le séparateur.

    3- Donc là encore, il est ESSENTIEL de définir CLAIREMENT la STRUCTURE des données à traiter.
    Là je suis bien d'accord avec toi.

    @CosmoKnacki :
    Quand j'ai écris
    Je reste persuadé que cela doit être faisable,
    devine à qui je pensais

Discussions similaires

  1. mettre un entier dans une string
    Par kinder29 dans le forum SL & STL
    Réponses: 14
    Dernier message: 14/02/2005, 11h54
  2. Recuperer un champ calculé dans une variable....
    Par vijeo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 21/12/2004, 14h57
  3. [DOM] sauver dans une String
    Par hocinema dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 28/09/2004, 21h44
  4. calcul dans une requête
    Par blaz dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/12/2003, 10h31
  5. [Syntaxe] mettre des ' dans une string ?
    Par souch dans le forum Débuter
    Réponses: 4
    Dernier message: 14/08/2003, 16h26

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