par
naholyr » 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 :
champ.value = !isNaN(parseInt(champ.value)) ? Math.abs(parseInt(champ.value)) : '';