Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/02/2011, 14h46   #1
Invité de passage
 
Inscription : février 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 4
Points : 0
Points : 0
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 :
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.
ggmayor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 16h02   #2
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 450
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 450
Points : 2 149
Points : 2 149
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 :
1
2
var champ5 = (champ1 || 0) + (champ2 || 0);
document.getElementById("champ5").value=champ5;
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 16h03   #3
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 572
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 572
Points : 4 073
Points : 4 073
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
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 17h56   #4
Invité de passage
 
Inscription : février 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 4
Points : 0
Points : 0
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 :
echo $this->Form->input('prix_libre3', array('id'=>'prix_libre3','onChange'=>'calcul()'));
et ceci est ma fonction intégrale :

Code :
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.
ggmayor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 18h23   #5
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 930
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 930
Points : 4 744
Points : 4 744
pour moi cela ne semble pas la bonne méthode.
Attention à la valeur retournée par isNaN, il suffit de tester
Code :
1
2
3
alert( isNaN( ''));
alert( isNaN( ' '));
alert( isNaN( 'a'));
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 18h51   #6
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 572
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 572
Points : 4 073
Points : 4 073
Y'a quand même plusieurs choses étranges

Pourquoi ce test ?
Code javascript :
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.
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 20h54   #7
Invité de passage
 
Inscription : février 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 4
Points : 0
Points : 0
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.
ggmayor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 21h18   #8
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 572
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 572
Points : 4 073
Points : 4 073
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...
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 21h48   #9
Invité de passage
 
Inscription : février 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 4
Points : 0
Points : 0
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?
ggmayor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 21h53   #10
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 007
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 007
Points : 45 091
Points : 45 091
sinon je peux vous la faire en torturé des méninges ?

Code :
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
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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2011, 08h39   #11
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 450
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 450
Points : 2 149
Points : 2 149
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 :
<input type="text" onkeyup = "return this.value = this.value.match(/[+-]?(?:[0-9]+(?:\.[0-9]*)?)?/);"/>
Bon après c'est juste mon avis hein. ^_^
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h35.


 
 
 
 
Partenaires

Hébergement Web