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 :

Additionner des nombres avec la devise ( le caractère € )


Sujet :

JavaScript

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 274
    Points : 114
    Points
    114
    Par défaut Additionner des nombres avec la devise ( le caractère € )
    Bonjour tout le monde,

    je viens vers vous pour un problème d'addition depuis des chaîne de caractère...

    J'ai ceci :
    50.05 €;
    25.36 €;

    J'ai donc utiliser un replace pour remplacer les " €" par rien (donc supprimer les € et espace vide) puis un parseFloat pour les nombre flottant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    a = "50.05 €"
    b = "25.36 €"
     
    a = parseFloat(a.replace(" €","")); // Aucune erreur et avec un console.log il me met bien 50.05
    b = parseFloat(b.replace(" €","")); // Aucune erreur et avec un console.log il me met bien 25.36
     
    alert(a+b); // Résultat 50.0525.36
    Mon problème est donc que plutôt que d'additionner il concatène ce qui n'est pas l'objectif évidemment...
    Quelqu'un aurait déjà eu ce soucis ?

    D'avance merci

  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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 108
    Points : 44 921
    Points
    44 921
    Par défaut
    Bonjour,
    en l'état je ne vois pas de lézard !

    Le code ci-dessous devrait même suffire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a = parseFloat(a);
    b = parseFloat(b);
    A vérifier qu'il n'y a pas un caractère non affiché en début de chaine.

  4. #4
    Membre expérimenté
    Avatar de Gnuum
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Points : 1 715
    Points
    1 715
    Billets dans le blog
    1
    Par défaut
    Ce code ne fonctionnera pas de toute façon à cause des erreurs d'arrondis des floats.
    Quand tu fais des calculs de ce type, il faut repasser en entier.


    Si tu es sûr d'avoir des centimes (même quand ça vaut "00"), voilà ce que tu peux faire (je suis resté volontairement proche de ton code):


    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    a = "50.05 €"
    b = "25.36 €"
     
     
    var aInt = parseInt(a.replace(/[\.€\s]/g, ''), 10);
    var bInt = parseInt(b.replace(/[\.€\s]/g, ''), 10);
     
     
    alert((aInt + bInt) / 100);

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 108
    Points : 44 921
    Points
    44 921
    Par défaut
    Dans ta solution il faut impérativement que le nombre de décimal soit le même sans oublier les zéros non significatifs.

  6. #6
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    const
      number1 = '10 235,24',
      number2 = '13714.05';
     
    function addEuroString( strNum1 = "1 000,25", strNum2 = "0.50 €"){
      let
        nb1 = parseFloat( strNum1.replace( /,/g, '.' ).replace( /[^0-9.]/g, '') ),
        nb2 = parseFloat( strNum2.replace( /,/g, '.' ).replace( /[^0-9.]/g, '') );
     
      return ( nb1 + nb2 ).toString( 10 ).replace( /\./g, ',' ) + " €";
    }
     
    console.log( "1 000,25 + 0.50 = ", addEuroString() );
    console.log( "number1 + number2 = ", addEuroString( number1, number2 ) );

  7. #7
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    a = "50.05 €"
    b = "25.36 €"
     
    function Numberize(num){
    return +num.match(/[\d.]+/) 
    } 
     
    function ADDCurrencies(P1, P2){
    return Numberize(P1) + Numberize(P2) + " €";
    } 
     
    alert( ADDCurrencies(a,b))

    https://jsfiddle.net/cxhLvub6/


    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a = "50.05 €", b= "25.36 €";
    var N = (n) => {return +n.match(/[\d.]+/);};
    var C = (p1,p2) => {return N(p1) + N(p2) + " €";}
    alert( C(a,b));
    et pour le fun
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a = "50.05 €", b= "25.36 €";
    var C = (x,y) => {r=/[\d.]+/; return +x.match(r) + +y.match(r) + " €";}
    alert( C(a,b));

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour les zinzins

    [EDIT] Je reprends mes billes... (erreur)

    N.B. ...vouloir faire des calculs en JavaScript relève de la psychiatrie !
    Dernière modification par Invité ; 03/12/2016 à 16h03.

  9. #9
    Membre expérimenté
    Avatar de Gnuum
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Points : 1 715
    Points
    1 715
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par NoSmoking
    Dans ta solution il faut impérativement que le nombre de décimal soit le même sans oublier les zéros non significatifs.
    C'est pour ça que j'ai bien précisé:
    Citation Envoyé par Gnuum
    Si tu es sûr d'avoir des centimes (même quand ça vaut "00")
    Vraiment, je ne conseille pas de calcul de prix avec des floats (et ce n'est pas propre au JavaScript). Ca induit des erreurs d'arrondis à coup sûr (car D dense dans D).

  10. #10
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2014
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Arménie

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2014
    Messages : 388
    Points : 580
    Points
    580
    Par défaut
    Bonjour,

    Le code du premier message de cette discussion, celui proposé par splifferwolf, fonctionne normalement avec Firefox chez moi. Je suis surpris "que plutôt que d'additionner il concatène"...

    Avec quel navigateur il concatène au lieu d'additionner?

    Sinon, la variante ci-dessous devrait fonctionner aussi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    a = "50.05 €";
    b = "25.36 €";
     
    a = 1*(a.replace("€",""));
    b = 1*(b.replace("€",""));
     
    alert(a+b);

  11. #11
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    normal avec 1* ...

  12. #12
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 143
    Points
    11 143
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour les zinzins
    Bonjour les artistes

    je ne sais pas pourquoi mais quand j'ai vu les codes postés, j'ai repensé à cette discussion

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 108
    Points : 44 921
    Points
    44 921
    Par défaut Reprise message suite à soucis réseau !
    Citation Envoyé par Gnuum
    C'est pour ça que j'ai bien précisé:
    (...)
    effectivement, mauvaise interprétation de ma part

    Citation Envoyé par jreaux62
    Si je reprends juste le 1er code :
    alert( a+b ); // ici, on a CONCATENATION (des nombres ou chaines)
    le nombre de parenthèses n'influe pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var a = '1';
    var b = '2';
    alert(a + b);  // -> 12
    alert((a + b)) // -> 12
     
    a = 1;
    b = 2;
    alert(a + b);  // -> 3
    alert((a + b)) // -> 3
    Citation Envoyé par jreaux62
    N.B. ...vouloir faire des calculs en JavaScript relève de la psychiatrie !
    c'est peut être un peu exagéré quand même, il n'y a pas que des calculs de panier, mais il est vrai que les calculs, et surtout l'affichage, doivent être fait en connaissance des soucis liés aux flottants, ceci ayant déjà été largement abordés sur le forum.


    Le soucis que rencontre splifferwolf n'est visiblement pas un problème d'arrondi mais de bien rendu de résultat et donc
    Citation Envoyé par NoSmoking
    en l'état je ne vois pas de lézard !
    on va donc attendre son intervention pour plus ample informations.

  14. #14
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Je rajoute que la confusion entre concaténation et addition est surtout liée aux types des variables. Si on fait toujours attention aux types, on n’a pas de soucis.

    J’admets que le faible typage de JavaScript autorise certaines mauvaises pratiques ; et que ça oblige à avoir une certaine connaissance du langage pour comprendre le problème. Mais ce n’est pas exclusif à JS, et on est plutôt bien lotis à ce niveau si on compare à PHP, pour qui 'php' == 0 par exemple.

    En adoptant de bonnes habitudes on évite la plupart des problèmes. Entre autres :
    • Toujours parser les nombres quand on n’est pas sûr de leur type (en particulier quand ils viennent d’un champ de formulaire ; j’ai eu la désagréable surprise de voir que les <input type="number"> avaient une valeur de type string ) ;
    • Toujours faire des comparaisons strictes === et !==, au lieu de == et !=.
    • Grouper entre parenthèses, même si ce n’est pas nécessaire, quand on veut additionner des variables de différents types, par exemple :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      bidule.style.left = (e.pageX + 42) + 'px';

Discussions similaires

  1. [PHP 5.2] Additionner des nombres entiers dans une chaine de caractères
    Par lecaptain dans le forum Langage
    Réponses: 2
    Dernier message: 23/10/2009, 12h12
  2. additionner des nombres à virgules
    Par Phiss dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/03/2006, 10h35
  3. [MySQL] extraire des nombre d'une chaine de caractères et addition
    Par Yotho dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/03/2006, 16h54
  4. [MySQL] Additionner des nombres dans un array
    Par azorol dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 10/02/2006, 11h34
  5. sum avec des nombres avec virgule
    Par Bruno2000 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 30/09/2004, 15h01

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