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 :

La condition if n'est pas reconnue


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 4
    Par défaut La condition if n'est pas reconnue
    Bonjour,
    Je développe un formulaire en php et pour expliquer simple :
    sur mon formulaire j'ai 4 champs de saisie pour 4 nombres et le but
    est chaque fois qu'on sort d'un champ, il fait le calcul des 4 champs dans
    le dernier. Jusque là pas de problème, j'appelle depuis mon champ la fonction
    qui me fait le calcul.

    Ou sa se corse, c'est que si je fais champ5 = champ1 + champ2 + champ3 + champ4 alors si un des champ est vide, le total verra apparaître NaN.

    Donc j'ai essayé de contourner le problème en faisant des conditions que
    si par exemple le champ2 est vide, il faut pas le prendre dans le total.

    Je vous montre le code (dans cet exemple si les 3 premiers champs sont vides, alors il calcule que le dernier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ((isNaN(champ1))&&(isNaN(champ2))&&(isNaN(champ3))){
    			var champ5 = parseFloat(document.getElementById("champ4").value);
    			document.getElementById("champ5").value=champ5;
    			}
    Et le problème, c'est que j'ai l'impression que mon programme n'exécute pas le code.

    Là ça fait des jours que je cherche et je trouve pas.

    Merci à vous pour votre aide précieuse.

    Guy.

  2. #2
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Apparement l'erreur n'est pas dans le code que t'as posté (en tout cas j'en vois pas). Faudrait en donner plus...

    Par contre tu peux tester comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var champ5 = (champ1 || 0) + (champ2 || 0);
    document.getElementById("champ5").value=champ5;

  3. #3
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    L'extrait que tu montres est "théorique" pour nous expliquer le problème ou bien tiré directement de ta page ?

    Montre nous la fonction de vérification en entier s'il te plait ainsi que l'extrait de html correspondant aux formulaires

  4. #4
    Futur Membre du Club
    Inscrit en
    Février 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 4
    Par défaut
    Merci déjà pour vos réponses, j'ai testé la première réponse et il ne se passe rien.

    Oui, c'était théorique mais quand même tiré de mon code et j'avais apuré un peu pour faire moins long.

    Mon formulaire est en fait composé de :
    du champ prix_libre1 //ici l'utilisateur insère ce qu'il veut
    du champ prix_libre2 //ici l'utilisateur insère ce qu'il veut
    du champ prix_libre3 //ici l'utilisateur insère ce qu'il veut
    du champ prix_libre4 //ici l'utilisateur insère ce qu'il veut
    du champ montant_ht //ce champ va totaliser les 4 champs du dessus
    du champ montant_tva //ce champ va calculer le montant_ht * 19.6%
    du champ total_final //cd champ va additionner le montant_ht + la TVA
    Voilà ceci est placé en réel.

    Là je dois préciser que si je n'ai pas besoin de tester mes champs et que
    je saisis dans l'ordre le champ 1, 2, 3 et 4 pour la saisie, tout est OK, mais
    le problème survient si j'efface par exemple une valeur du champ 2 ou si
    je commence à saisir le prix_libre2 et que je n'ai rien sur le prix_libre1.

    Donc je vais vous mettre le code exact :

    Ceci est l'insertion du champ et l'appel de la fonction (ca j'ai testé, ca fonctionne)

    L'insertion du champ se passe ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $this->Form->input('prix_libre3', array('id'=>'prix_libre3','onChange'=>'calcul()'));
    et ceci est ma fonction intégrale :

    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
     
    <script language="javascript">
    function calcul()
    	{
    		var champ1 = document.getElementById("prix_libre1").value;
    		var champ2 = document.getElementById("prix_libre2").value;
    		var champ3 = document.getElementById("prix_libre3").value;
    		var champ4 = document.getElementById("prix_libre4").value;
    		var champ5 = document.getElementById("montant_ht").value;
    		var champ6 = document.getElementById("montant_tva").value;
     
    		if ((isNaN(champ1))&&(isNaN(champ2))&&(isNaN(champ4))){
    			var totalht = parseFloat(document.getElementById("prix_libre3").value);
    			document.getElementById("montant_ht").value=totalht;
    			var totaltva = parseFloat (totalht)*(19.6/100);
    			document.getElementById("montant_tva").value=totaltva;
    			var total = parseFloat (document.getElementById("montant_ht").value)+parseFloat (document.getElementById("montant_tva").value);
    			document.getElementById("total_final").value = total;
    			}		
    		}
    </script>
    Voilà en vous remerciant d'avance.

    Guy.

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    pour moi cela ne semble pas la bonne méthode.
    Attention à la valeur retournée par isNaN, il suffit de tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    alert( isNaN( ''));
    alert( isNaN( ' '));
    alert( isNaN( 'a'));

  6. #6
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Y'a quand même plusieurs choses étranges

    Pourquoi ce test ?
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((isNaN(champ1))&&(isNaN(champ2))&&(isNaN(champ4)))
    Il n'y aurait pas une inversion ? isNaN renvoie "true" si le paramètre fourni n'est *pas* un nombre. Tu n'entres dans cette conditionnelle QUE SI les champs 1, 2 et 4 SONT vides ou remplis avec quelquechose qui n'est pas un nombre. Dans tous les autres cas de figure, la fonction ne fait strictement rien.

    Et aussi : pourquoi le champ3 a-t-il un statut particulier ? Qu'est-ce qui se passe si ce champ qui est vide aussi (genre champs 1 et 2 renseignés seulement) ?

    Reprends la logique de vérification sur papier simple pour t'y retrouver, et une fois que tout est clair tu peux attaquer la transcription en code.

    En tout cas à vue de nez je dirais que tu devrais plutôt vérifier les champs séparément, parce que si tu dois écrire un if en dur pour chaque combinaison de champs vides/non vides.... ça va faire un paquet de lignes

    Sépare les tests : vérifie d'abord si le champ est vide ou pas, ensuite si son contenu est un nombre valide. Après les tests de chaque champ tu sais si tu as quatre montants valides ou pas ^^

    Mais c'est toi qui détient les règles métier à appliquer ici : "0" est-il un montant valide ? un montant négatif est-il valide ? etc.

  7. #7
    Futur Membre du Club
    Inscrit en
    Février 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 4
    Par défaut
    Merci à vous tous,

    J'ai tout bien regardé et cet après-midi j'étais pas assez attentif.

    En fait, la solution de Loceka est parfaite, j'avais mal interprété.

    Merci encore et à bientot.

  8. #8
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par ggmayor Voir le message
    Merci à vous tous,

    J'ai tout bien regardé et cet après-midi j'étais pas assez attentif.

    En fait, la solution de Loceka est parfaite, j'avais mal interprété.

    Merci encore et à bientot.
    Ca ne suffit pas. Essaie de rentrer "coucou" dans un de tes champs pour voir...

  9. #9
    Futur Membre du Club
    Inscrit en
    Février 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 4
    Par défaut
    effectivement si je mets coucou, j'ai NaN dans mes totaux.

    Oui, c'est vrai, il faudrait encore que je teste le champ et que le programme ne laisse pas sortir du champ tant que ce n'est pas vide ou un chiffre. Est-ce bien ça?

  10. #10
    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 658
    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 658
    Billets dans le blog
    1
    Par défaut
    sinon je peux vous la faire en torturé des méninges ?

    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
    var champs1='2'
    var champs2=6
    var champs3='coucou'
     
    function toNum(n,operateur){
     
    switch (operateur){
    	case '+' : 
    	case '-' : return ((isNaN(n))?0:n*1||0);
    	case "*"  : 
    	case "/"  : return ((isNaN(n))?1:n*1||1);
    }
    }
     
    alert(toNum(champs1,'+')+toNum(champs2,'+')+toNum(champs3,'+'))
    alert(toNum(champs1,'-')-toNum(champs2,'-')-toNum(champs3,'-'))
    alert(toNum(champs1,'*')*toNum(champs2,'*')*toNum(champs3,'*'))
    du coup plus besoin de test if
    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 !

  11. #11
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Citation Envoyé par RomainVALERI Voir le message
    Ca ne suffit pas. Essaie de rentrer "coucou" dans un de tes champs pour voir...
    Exact, seulement c'est mal de mélanger la partie calcul et la partie vérification. En partant du principe que ton champ est soit vide soit bien formé, la méthode des "||" fonctionne.

    Après il faut avoir testé au préalable que l'utilisateur n'a pas rentré des aberrations parce que, dans un tel cas, il est préférable de le remettre à sa place (à coup d'alert ou de messages d'erreur) plutôt que de considérer qu'un champs mal rempli vaut une valeur par défaut (0 ou 1 selon l'élément neutre de l'opération utilisée).

    La vérification peut simplement se faire avec une regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="text" onkeyup = "return this.value = this.value.match(/[+-]?(?:[0-9]+(?:\.[0-9]*)?)?/);"/>
    Bon après c'est juste mon avis hein. ^_^

Discussions similaires

  1. [UBUNTU] Le live cd n'est pas reconnu comme un cédérom bootable
    Par Jihed Amine Maaref dans le forum Ubuntu
    Réponses: 4
    Dernier message: 12/07/2006, 14h37
  2. Réponses: 1
    Dernier message: 09/06/2006, 21h02
  3. Réponses: 3
    Dernier message: 16/05/2006, 16h34
  4. DOS: la commande 'more' n'est pas reconnue...
    Par billoum dans le forum Windows Serveur
    Réponses: 8
    Dernier message: 02/05/2006, 17h11
  5. Réponses: 8
    Dernier message: 04/08/2004, 14h17

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