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 :

addition, soustraction ou division de 2 valeurs number_format


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut addition, soustraction ou division de 2 valeurs number_format
    Bonsoir tout le monde,

    J'ai un petit formulaire qui récupere des infos venues d'une BDD SQL, jusque la rien de mystérieux ..

    Les infos pour une question de confort sont formatées : number_format($nombre, 2, ',', ' ') avant d'arriver dans la value du champ.

    Mon probleme est double

    1 - D'abord en PHP, il m'est impossible d'additionner/soustraire, diviser ou multiplier les resultats de valeurs qui sont déja préalablement formatées ... vous me direz c'est normal number_format renvoi un string donc non numérique.
    Ma question est comment faire dans ce cas pour visualiser des valeur avec espace pour les milliers tout en conservant la possibilité aprés affichage de pouvoir manier les resultats comme on veut
    2 - Ce qui en decoule du javascript, c'est qu'il m'arrive en javascript de recuperer la valeur d'un champ pour la traiter et afficher le resultat dans un div exterieur et la bim, il ne peut pas car la valeur recupérée n'est plus du numerique a cause du number_format qui aura rajouté un espace.

    Comment puis je faire s'il vous plait, j'ai recherché mais rien ne permet un format avec séparateur sans qu'aprés le value ne soit plus exploitable.

    Pour étayer mon propos voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $number = 1234.56;
    $number = number_format($number, 2, ',', ' ');       
    echo '$number : '.$number.'<br>';   // res : 1 234,56 OK
    $number = $number / 2;
    echo '$number : '.$number.'<br>';    // res : 0.5 FAUX  ---- il ne divise que le 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $number = 1234.56;
    $number = number_format($number, 2, ',', '.');       
    echo '$number : '.$number.'<br>';   // res : 1.234,56 OK
    $number = $number / 2;
    echo '$number : '.$number.'<br>';    // res : 0.617 FAUX

    MErci a vous.
    Bonne soirée
    Guillaume

  2. #2
    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
    Tu fais les calculs sur une variable et l’affichage avec une autre dans laquelle tu mets la valeur de l’autre.

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    il faut utiliser la bibliothèque d'i18n/l10n pour inverser number_format().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $number = 1234.56;
    $number = number_format($number, 2, ',', ' ');
    echo '$number : '.$number.'<br>';   // res : 1 234,56 OK
    $fmt = new NumberFormatter('fr_FR', NumberFormatter::DECIMAL);
    $num = $fmt->parse($number);
    $num = $num / 2;   // 617.28
    echo '$num : '.$num.'<br>';
    Même approche du côté de JS

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Merci pour votre aide mais j'ai plus de 2000 champs qui présentent cette problématique, si je dois doubler les valeurs a traiter ou encore faire un script a 6 lignes pour chaque traitement c'est impossible.

    Je pensais qu'il y avait une fonction autre qui autorisait le format sans transformer la chaine en alphanumerique......

  5. #5
    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
    Et tu te rends compte du problème au bout de tout ça ? Je ne comprends pas.

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

    1-
    Citation Envoyé par kaolivier Voir le message
    ...ou encore faire un script a 6 lignes pour chaque traitement c'est impossible.......
    ...Je pensais qu'il y avait une fonction...
    C'est justement à ça que servent les.... fonctions.
    Rien ne T'empêches d'en écrire une ou plusieurs (fonction PHP et/ou JavaScript).

    2- Normalement, c'est la valeur numérique qu'on enregistre en bdd.
    Et on n'utilise number_format qu'au moment de l'affichage.

    Tu as donc un souci de conception initiale.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Citation Envoyé par badaze Voir le message
    Et tu te rends compte du problème au bout de tout ça ? Je ne comprends pas.
    Bonjour Badaze,

    AU départ il n'était pas question de formater les données avec un séparateur de milliers, le site a donc été fait au fur et à mesure des années et des milliers et milliers de champs ont été créés pour répondre a la demande de mes clients.
    Ensuite, les clients ont sollicité un format de lecture des values dans les champs pour rendre confortable la lecture des données.

    Maintenant que toute la structure a été faite, c'est moins évident de sortir des milliers d'infos d'une BDD, de detecter celles qui devront être formatées, ou pas, et les inserer dans les value des champs.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,
    ....
    2- Normalement, c'est la valeur numérique qu'on enregistre en bdd.
    Et on n'utilise number_format qu'au moment de l'affichage.

    Tu as donc un souci de conception initiale.

    Bonjour jreaux62,

    Le problème n'est pas l'insertion dans la BDD, le problème est la réutilisation d'une donnée formatée, une fois avoir récuperé la valeur numerique venant de la BDD, notamment avec le javascript qui devra par la suite traiter l'information numerique notamment pour faire des calculs, afficher des graphes, etc....

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par kaolivier Voir le message
    ...Les infos pour une question de confort sont formatées : number_format($nombre, 2, ',', ' ') avant d'arriver dans la value du champ....
    A partir du moment ou tu SAIS comment tu as formaté les données, il devient (très) facile de créer la/les * fonctions inverses ! (* PHP et JS)


    Ici, tu formates "à la française".

    1- Pour la fonction inverse en PHP :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function number_format_to_floatval( $value_formatee )
    {
       return str_replace( [',', ' '], ['.', ''], $value_formatee ); // on remplace par la "norme décimale" (point pour décimal, pas d'espace)
    }
     
    $value_float = number_format_to_floatval( $value_formatee );

    2- A toi d'écrire la fonction équivalente en JavaScript.


    Remarques :
    Si tu es LE SEUL a faire ces modif., et que tu n'envisages qu'une seule langue/formatage, alors c'est simple.
    Sinon, il faut adapter en fonction de la langue/type de formatage, en ajoutant aux fonctions le paramètre "langue", par exemple.

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/01/2013, 23h55
  2. Division de la valeur de deux colonnes
    Par fabfor dans le forum Développement
    Réponses: 2
    Dernier message: 03/10/2008, 16h38
  3. Trouver un Nb divisible par N valeur
    Par rico63 dans le forum Excel
    Réponses: 3
    Dernier message: 06/02/2008, 14h22
  4. Addition/Soustraction Dans Access
    Par kitou19 dans le forum Access
    Réponses: 12
    Dernier message: 12/03/2007, 18h28

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