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 automatique


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 196
    Points : 98
    Points
    98
    Par défaut calcul automatique
    Bonjour,

    J'ai besoin d'effectuer un calcul de tarifs dans mon formulaire (Chronoforms), avant de le soumettre.
    J'ai tenté 2 manières, bouton "calculer" et "onchange" sur les input... rien de se passe.
    J'ai 2 possibilités, soit je traite avec un individu, soit avec une entreprise (qui peut payer pour plusieurs individus).

    Voici le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function calculer(nb)
    {
    m=document.getElementById("totalInsc").value;
    t=document.getElementById("tarif").value;
    a=document.getElementById("ajtMontant").value;
    d=document.getElementById("dedMontant").value);
    m=(t+a-d)*nb;
    }
    et le formulaire :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <table>
    <tr>
    <td><label class="cf_label" style="width: 100px;">Tarif de base</label></td>
    <td><input class="cf_inputbox" maxlength="150" size="10" title="" id="tarif" name="tarif" type="text" value="<?php echo $row["tarif"]; ?>" /></td>
    <td></td>
    </tr>
    <tr>
    <td><label class="cf_label" style="width: 100px;">Compl&eacute;ments (+)</label></td>
    <td><input class="cf_inputbox" maxlength="150" size="10" title="" id="ajtMontant" name="ajtMontant" type="text" value="0"/></td>
    <td><input class="cf_inputbox" maxlength="150" size="20" title="" name="libAjtMontant" type="text" /></td>
    </tr>
    <tr>
    <td><label class="cf_label" style="width: 100px;">D&eacute;ductions (-)</label></td>
    <td> <input class="cf_inputbox" maxlength="150" size="10" title="" id="dedMontant" name="dedMontant" type="text" value="0" /></td>
    <td><input class="cf_inputbox" maxlength="150" size="20" title="" name="libDedMontant" type="text" /></td>
    </tr>
    <?php if(!isset($_POST["idClient"])) {
    ?>
    <!-- ceci s'affiche s'il s'agit d'un individuel -->
    <tr>
    <td><label class="cf_label" style="width: 100px;">Total</label></td>
    <td><input class="cf_inputbox" maxlength="150" size="10" title="" id="totalInsc" name="totalInsc" type="text"  value="<?php echo $row["tarif"]; ?>"/></td>
    <td><input value="Calculer" name="calculer" type="button" onclick="calculer(1)" /></td>
    </tr>
    <?php } else { ?>
    <!-- ceci s'affiche s'il s'agit d'un client, susceptible de financer plusieurs individus -->
    <tr>
    <td><label class="cf_label" style="width: 100px;">Total</label></td>
    <td><input class="cf_inputbox" maxlength="150" size="10" title="" id="totalInsc" name="totalInsc" type="text" value="<?php $tarif=$row["tarif"]*$nb; echo number_format($tarif, 2, '.', ' '); ?>"/></td>
    <td><input value="Calculer" name="calculer" type="button" onclick="<?php echo 'calculer('.$nb.')';?>" /></td>
    </tr>
    <?php } ?>
    </table>

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 196
    Points : 98
    Points
    98
    Par défaut
    En désespoir de cause j'essaye de faire mon calcul sur l'événement onclick...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onclick="this.value=(tarif.value+ajtMontant.value-dedMontant.value)*2;"
    Mais ça concatène : 100+20-10 me donne 20020 et encore si je rajoute les décimales ça foire avec un beau NaN !
    Je détèèèèèèste Javascript !

  3. #3
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    tu récupères des strings il faut donc les parser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var a = "10";
    var b = "25";
    alert(a+b);
    alert(parseInt(a)+parseInt(b));
    voila

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    Effectivement comme le dit notre modo il faut utiliser le parseInt(chaine)

    Mais je poste plutôt pour ça :

    Je détèèèèèèste Javascript !
    Non ne dit pas ça Javascript c'est beau

    Et pour ça :

    Prend l'habitude de donner des noms de variables plus longs qu'un simple m, a, t, etc...
    Ton code sera plus compréhensible quand tu le reliras plus tard ou s'il sera maintenu par une autre personne un jour.
    Cela ne gênera pas tes formules^^

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 196
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par dragonno Voir le message
    Non ne dit pas ça Javascript c'est beau
    Oui sans doute, mais il me donner beaucoup plus de fil à retordre que les langages auxquels je suis habituée !! Pas de messages d'erreur tout ça...


    Bon j'va tester et je reviens rendre compte !

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 196
    Points : 98
    Points
    98
    Par défaut
    Ca concaténait toujours, j'ai du jongler avec les parenthèses...et passer par un hidden field pour récupérer mon nombre de participants :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
       <?php } 
    /* ETAPE 3 et 4 : Calculer le total */
    ?>
    <div class="form_element cf_textbox">
    <label class="cf_label" style="width: 200px;">&nbsp;</label>
    <table>
    <tr>
    <td><label class="cf_label" style="width: 100px;">Tarif de base</label></td>
    <td><input class="cf_inputbox" maxlength="150" size="10" title="" id="tarif" name="tarif" type="text" value="<?php echo number_format($row["tarif"],0); ?>" /></td>
    <td></td>
    </tr>
    <tr>
    <td><label class="cf_label" style="width: 100px;">Compl&eacute;ments (+)</label></td>
    <td><input class="cf_inputbox" maxlength="150" size="10" title="" id="ajtMontant" name="ajtMontant" type="text" value="0" onchange="totalInsc.value=(parseInt(tarif.value)+parseInt(ajtMontant.value)-parseInt(dedMontant.value));"/></td>
    <td><input class="cf_inputbox" maxlength="150" size="20" title="" name="libAjtMontant" type="text" value="par auditeur" onClick="this.value='';"/></td>
    </tr>
    <tr>
    <td><label class="cf_label" style="width: 100px;">D&eacute;ductions (-)</label></td>
    <td> <input class="cf_inputbox" maxlength="150" size="10" title="" id="dedMontant" name="dedMontant" type="text" value="0" onchange="totalInsc.value=(parseInt(tarif.value)+parseInt(ajtMontant.value)-parseInt(dedMontant.value));" /></td>
    <td><input class="cf_inputbox" maxlength="150" size="20" title="" name="libDedMontant" type="text" value="par auditeur" onClick="this.value='';"/></td>
    </tr>
    <?php if(!isset($_POST["idClient"])) {
    ?>
    <tr>
    <td><label class="cf_label" style="width: 100px;">Total</label></td>
    <td><input class="cf_inputbox" maxlength="150" size="10" title="" id="totalInsc" name="totalInsc" type="text"  value="<?php echo number_format($row["tarif"],0); ?>"/></td>
    <td><input value="Calculer" name="calculer" type="button" onclick="totalInsc.value=(parseInt(tarif.value)+parseInt(ajtMontant.value)-parseInt(dedMontant.value));" /></td>
    </tr>
    <?php } else { ?>
    <tr>
    <td><label class="cf_label" style="width: 100px;">Total</label></td>
    <td><input class="cf_inputbox" maxlength="150" size="10" title="" id="totalInsc" name="totalInsc" type="text" onclick="totalInsc.value=((parseInt(tarif.value)+parseInt(ajtMontant.value))-parseInt(dedMontant.value))*parseInt(nb.value);"/></td>
    <td><input type="hidden" name="nb" value="<?php echo $nb;?>"/>
    <input value="Calculer" name="calculer" type="button" onClick="totalInsc.value=((parseInt(tarif.value)+parseInt(ajtMontant.value))-parseInt(dedMontant.value))*parseInt(nb.value);" /></td>
    </tr>
    <?php } ?>
    </table>
     
        </div>
    pfiouh ! que de boulot pour un simple calcul... mdr

    Merci pour le tuyau
    Je vais tenter de rajouter les décimales, j'ai cru comprendre que c'était parseFloat() qu'il fallait utiliser.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 196
    Points : 98
    Points
    98
    Par défaut
    Bon je suis passée à parseFloat, en veillant bien à avoir des . dans mes décimales et non des , (grrr)
    Mais le résultat est un entier malgré tout.
    Je cherche donc un équivalent de number_format en PHP (Math.round ne fonctionne pas)...

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <table>
    <tr>
    <td><label class="cf_label" style="width: 100px;">Tarif de base</label></td>
    <td><input  class="argent" maxlength="150" size="10" title="" id="tarif" name="tarif" type="text" value="<?php echo number_format($row["tarif"],2,'.',' '); ?>" /></td>
    <td></td>
    </tr>
    <tr>
    <td><label class="cf_label" style="width: 100px;">Compl&eacute;ments (+)</label></td>
    <td><input  class="argent" maxlength="150" size="10" title="" id="ajtMontant" name="ajtMontant" type="text" value="0.00" onchange="totalInsc.value=(parseFloat(tarif.value)+parseFloat(ajtMontant.value)-parseFloat(dedMontant.value));"/></td>
    <td><input class="cf_inputbox" maxlength="150" size="20" title="" name="libAjtMontant" type="text" value="par auditeur" onClick="this.value='';"/></td>
    </tr>
    <tr>
    <td><label class="cf_label" style="width: 100px;">D&eacute;ductions (-)</label></td>
    <td> <input  class="argent" maxlength="150" size="10" title="" id="dedMontant" name="dedMontant" type="text" value="0.00" onchange="totalInsc.value=(parseFloat(tarif.value)+parseFloat(ajtMontant.value)-parseFloat(dedMontant.value));" /></td>
    <td><input class="cf_inputbox" maxlength="150" size="20" title="" name="libDedMontant" type="text" value="par auditeur" onClick="this.value='';"/></td>
    </tr>
    <?php if(!isset($_POST["idClient"])) {
    ?>
    <tr>
    <td><label class="cf_label" style="width: 100px;">Total</label></td>
    <td>
    <input  class="argent" class="cf_inputbox" maxlength="150" size="10" title="" id="totalInsc" name="totalInsc" type="text"  value="<?php echo number_format($row["tarif"],2,'.',' '); ?>"/>
    </td>
    <td><input value="Calculer" name="calculer" type="button" onclick="totalInsc.value=(parseFloat(tarif.value)+parseFloat(ajtMontant.value)-parseFloat(dedMontant.value));" /></td>
    </tr>
    <?php } else { ?>
    <tr>
    <td><label class="cf_label" style="width: 100px;">Total</label></td>
    <td>
    <input  class="argent" class="cf_inputbox" maxlength="150" size="10" title="" id="totalInsc" name="totalInsc" type="text" onclick="totalInsc.value=((parseFloat(tarif.value)+parseFloat(ajtMontant.value))-parseFloat(dedMontant.value))*parseInt(nb.value);"/>
    </td>
    <td><input type="hidden" name="nb" value="<?php echo $nb;?>"/>
    <input value="Calculer" name="calculer" type="button" onClick="totalInsc.value=((parseFloat(tarif.value)+parseFloat(ajtMontant.value))-parseFloat(dedMontant.value))*parseInt(nb.value);" /></td>
    </tr>
    <?php } ?>
    </table>

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    Bon je suis passée à parseFloat, en veillant bien à avoir des . dans mes décimales et non des , (grrr)
    Mais le résultat est un entier malgré tout.
    Tu fais des calculs sur des réels et tu obtiens entiers ?
    Bizarre.

    Je ne comprend pas si tu veux obtenir un entier en sortie ou un réel avec N décimales.
    (un N voulu).

    Pour le N décimales c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    N=5.245685
    arrondi=Math.round(N*100)/100; /* utilise 100 pour 2 décimale ou 1000 pour 3 décimales etc... */
    alert(arrondi);
    Sinon pour éviter la concaténation tu peux mettre les opérations entre parenthèses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alert("voici "+ 32+21); // donne voici3221
    alert("voici "+ (32+21) ); // donne voici 53


    Au cas où tu aurais besoin il y a aussi en javascript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Math.floor() et Math.cell() (arrondit supérieur et inférieur).
    Pour tester si un résultat est NaN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( isNaN(valeur) ) {//valeur est NaN}else{//valeur est correct}.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Pour PHP, regarde du côte de round() et de ceil() qui arrondi à l'entier supérieur.

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

Discussions similaires

  1. Calcul automatique dans des tableaux
    Par fremsoi dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 12
    Dernier message: 01/06/2006, 17h58
  2. effectuer un calculs automatique??
    Par annajoul dans le forum Access
    Réponses: 1
    Dernier message: 30/05/2006, 10h41
  3. CEdit et calcul automatique d'une expression réelle
    Par youngkoolboy dans le forum MFC
    Réponses: 8
    Dernier message: 03/05/2006, 19h38
  4. [VBA-E] calculs automatique sur une seule feuille
    Par repié dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/03/2006, 11h53
  5. Faire des calculs automatiques en JavaScript
    Par yoyot dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 28/02/2005, 10h31

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