Empecher l'ecriture de chiffre négatif

Mammouth du PHP | 19672 Messages

13 mars 2006, 12:22

Si il y a un problème avec le JavaScript, tu peux le voir dans la console JavaScript : si tu utilises Firefox, installe si ce n'est pas déjà fait la barre WebDevelopper : il y a une console JavaScript intégrée qui t'aidera à débugguer
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 159 Messages

13 mars 2006, 12:35

sinon ca te parait bon ce que j'ai fais ou pas ?

Mammouth du PHP | 19672 Messages

13 mars 2006, 12:52

Mais essaye-le : comment veux-tu que je sache si c'est bon ou pas: je n'ai pas ton code complet ni l'accès base de données nécessaire éventuellement, je ne peux rien tester. C'est à toi de le faire. Reviens si ça ne fonctionne pas avec les messages d'erreurs si tu en as.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 159 Messages

13 mars 2006, 12:59

je voulais juste savoir si ca ressemblait a quelque chose, c'est evident que tu ne peux me tenir si ca marche mais deja si ca ressemble a quelque chose

sinon Webdevelopper c'est excellent je connaissais pas du tout
sinon il ne connait pas indice il dit

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

13 mars 2006, 13:14

Ceci permettra de forcer l'écriture de nombres uniquement, et positifs, dans le champ, en "temps réel" :
<input type="text" onkeyup="forcePositif(this)" onchange="forcePositif(this)">
function forcePositif(champ) {
  champ.value = Math.abs(parseInt(champ.value) || 0);
}
Ensuite pour une vérification dans le onsubmit :
<form onsubmit="return pasNegatif(this.elements['monChamp'])">
<input type="text" name="monChamp">
<input type="submit">
</form>
function pasNegatif(champ) {
  if (champ.value != parseInt(champ.value) || champ.value < 0) {
    alert("Vous devez entrer un nombre positif dans le champ "+champ.name);
    return false;
  }
  return true;
}
La deuxième vérification est inutile si tu as choisi la première. Puisque soit l'utilisateur désactive javascript et il met ce qu'il veut (aucune vérification ni dans un cas ni dans l'autre), soit il l'active et il ne pourra pas mettre autre chose qu'un nombre négatif dans le champ.

J'attire cependant ton attention sur un problème : désactiver JS étant facile dans certains navigateurs (je le fais souvent en cas de problème, F12, un clic et c'est fait - idem dans l'autre sens), il est donc INDISPENSABLE de vérifier les données dans ton script PHP.

Eléphant du PHP | 159 Messages

13 mars 2006, 15:10

merci
sinon est il possible de mettre autre chose que zero quand on est dans le input, un espace par exemple

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

13 mars 2006, 15:43

Il faut que tu sois plus précis dans tes spécifications alors, soit tu ne veux que des nombres positifs, soit tu acceptes "nombres positifs ET espaces".

Eléphant du PHP | 159 Messages

13 mars 2006, 16:04

pardon en fait des que je met un - quand je teste il met aussitot un zero et il faut selectionner le zero pour ecrire un nombre positif

si j'efface le nombre present ca me automatiquement un zero

j'aimerais qu'il laisse un champs vide si c'est possible

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

13 mars 2006, 16:31

Je te laisse comprendre le script pour le modifier afin d'obtenir ce que tu souhaites ;)
C'est très facile, je préfère que tu comprennes ce que tu fais donc demande-moi ce que tu ne comprends pas dans le script.

Eléphant du PHP | 159 Messages

13 mars 2006, 17:01

ok, voila la fonction que j'utilise :
function forcePositif(champ) {
  champ.value = Math.abs(parseInt(champ.value) || 0);
}
Le nom de la fonction qui dois utiliser un champs : function forcePositif(champ) {

avec parseInt, on transforme bien la valeur du champs en nombre

avec Math.abs, on obtient la valeur absolue, donc un nombre positif forcément

|| c'est ou

donc je peux enlever || 0, non ?
je vais essayer
Modifié en dernier par budiste le 13 mars 2006, 17:24, modifié 1 fois.

Eléphant du PHP | 159 Messages

13 mars 2006, 17:03

j'ai enlevé ||0 mais ca met NaN quand je mets un nombre negatif pouquoi
ca devrait pas me mettre la valeur absolue de ce nombre normalement ?


par contre si je met 90 et que j'essaie de mettre - devant c'est bon ca met 90

Eléphant du PHP | 159 Messages

13 mars 2006, 18:07

j'ai mis || '' mais ca fais pareil qu'avec 0

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

13 mars 2006, 18:27

Oké, alors je te décortique le fonctionnement ;)

A || B vaut A si A n'est pas faux (ou assimilé : null, undefined, NaN, 0, etc...), et B sinon.
parseInt(X) renvoie la valeur numérique de X, et s'il n'arrive pas à convertir, renvoie NaN.
Du coup parseInt(X) || 0 renvoie parseInt(X) s'il a réussi à convertir, et sinon (puisque NaN est considéré comme faux), la seconde valeur soit : 0.
On prend la valeur absolue de tout ça pour virer les négatifs : Math.abs(parseInt(X) || 0).

Pour avoir la chaine vide, premier reflexe : Math.abs(parseInt(X) || ""). Raté, dans le cas où la conversion échoue parseInt(X) || "" va valoir la chaîne vide, et Math.abs("") faisant une conversion implicite (pfiou), il renvoie... 0 !

Il faut donc décaler le Math.abs : Math.abs(parseInt(X)) || "".

Nouveau problème : si on entre 0, Math.abs(parseInt(0)) renvoie bien 0, pas de souci. Par contre 0 || "" renvoie la chaîne vide, puisque 0 est considéré comme faux. Ce qui interdit du coup de pouvoir mettre 0 dans le champ que l'on contrôle.

Il ne faut donc pas se contenter de vérifier si parseInt(X) est faux ou assimilé mais s'il est ou non NaN (Not a Number, valeur de retour des fonctions mathématiques quand on leur donne un paramètre non numérique et non convertible).

Donc

Code : Tout sélectionner

Si lireEntier(X) est un nombre : ValeurAbsolue(lireEntier(X)). Sinon : ChaineVide.
ce qui se traduit en Javascript avec l'opérateur ternaire :

Code : Tout sélectionner

!isNaN(parseInt(X)) ? Math.abs(parseInt(X)) : ''
champ.value = !isNaN(parseInt(champ.value)) ? Math.abs(parseInt(champ.value)) : '';

Eléphant du PHP | 159 Messages

14 mars 2006, 09:31

ok
merci beaucoup car je connais vraiment rien au javascript, et donc ce soir je me coucherais moins con

merci encore