11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,
je voudrais contrôler la validité d'un nombre décimal par une expression régulière.
Je voudrais que seuls les nombres entiers et les décimals avec un point soit pris en compte.

voici mon code :
var reg = new RegExp(/^[0-9]+(.[0-9]+)?$/);
var value = "12.11";
alert(value +" "+reg.test(value));
value = "12e";
alert(value +" "+reg.test(value));
value = "12,11";
alert(value +" "+reg.test(value));



quelqu'un peut m'aider ?

PoichOU
Modifié par PoichOU (19 Dec 2006 - 16:17)
Salut,

"." est un méta-caractère, il faut l'échapper :
var reg = /^[0-9]+(\.[0-9]+)?$/;
Le constructeur RegExp n'est utile que lorsque tu utilises une chaîne de caractères, dans le cas contraire il vaut mieux utiliser un littéral.

Il est aussi possible d'écrire :
var isDecimal = (value == parseFloat(value));
mais ça retournera true pour "2.1e-10" ou "Infinity".
Je te remercie bien !!!


Je connais le parseFloat et l'utilisation de RegExp est volontaire.

Smiley jap merki
PoichOU a écrit :
Je connais le parseFloat et l'utilisation de RegExp est volontaire.
Tu veux dire que l'utilisation de "new regExp(/.../)" plutôt que "/.../" est volontaire ? Pourquoi ?
non je voulais dire qu'utiliser les expressions regulières à la place du parseFloat est volontaire.

je viens de voir qu'il n'était pas obligatoire d'utiliser RegExp.

Peux tu me dire la différence entre :

var reg = /^[0-9]+(\.[0-9]+)?$/;
var reg = new RegExp(/^[0-9]+(\.[0-9]+)?$/);
PoichOU a écrit :
var reg = /^[0-9]+(\.[0-9]+)?$/;
var reg = new RegExp(/^[0-9]+(\.[0-9]+)?$/);
Les deux solutions sont identiques, sauf que la seconde crée à ma connaissance systématiquement un nouvel objet, ce qui est consommateur de mémoire et inutile.

La différence est la même qu'entre <"pouet"> et <new String("pouet")>.
ok mais "pouet" et new String("pouet") sont exactement pareil non ?
je veux dire que dans les 2 cas l'objet String est crée. "pouet" est interprété comme new String("pouet") non ?

en tout cas c'est comme ça en java alors je me dit que peut être javascript est pareil...
PoichOU a écrit :
ok mais "pouet" et new String("pouet") sont exactement pareil non ?
je veux dire que dans les 2 cas l'objet String est crée. "pouet" est interprété comme new String("pouet") non ?

en tout cas c'est comme ça en java alors je me dit que peut être javascript est pareil...
C'est là que tu te trompes. Smiley cligne

Essaie cet exemple :
System.out.println("pouet" == "pouet");
System.out.println(new String("pouet") == "pouet");
Normalement, tu devrais obtenir :
true
false
Les chaînes de caractères sont "invariables" en Java comme en JavaScript, on peut donc se permettre d'utiliser le même objet si l'on est sûr que la chaîne est la même. Par contre, en spécifiant <new String("pouet")>, tu forces la création d'un objet.

Je ne sais pas exactement comment ça se passe en JavaScript, mais dans le doute, il vaut mieux utiliser le littéral, qui a en plus l'avantage d'être plus lisible.
Soit dit en passant, cette règle ne s'applique bien entendu pas aux littéraux objets et tableaux, qui ne sont eux pas invariables. "{}" et "[]" créent systématiquement de nouveaux objets.
Modifié par Eldebaran (19 Dec 2006 - 17:19)
je te remercie de cette précision.

System.out.println(new String("pouet") == "pouet");
donne false ça me parait logique.

Mais System.out.println("pouet" == "pouet"); donne true un peu moins.
Personnellement, j'aurai mis un equals ...


j'aurai appris quelque chose aujourd'hui !! Smiley biggrin
Modifié par PoichOU (19 Dec 2006 - 17:28)
Ca paraît peut-être juste un peu bizarre parce qu'en général en Java on compare deux chaînes avec la méthode equals à la place de l'opérateur d'égalité... aussi parce que l'opértaeur d'égalité du java vérifie une égalité stricte ce qui n'est pas le cas de javascript si on ne met que deux =. Enfin je peux me tromper mais je crois que c'est pour ça.

En général pour vérifier un nombre décimal, j'utilise cette regexp-ci :
/^-?\d+(\.\d+)?$/
QuentinC a écrit :
Ca paraît peut-être juste un peu bizarre parce qu'en général en Java on compare deux chaînes avec la méthode equals à la place de l'opérateur d'égalité...
La méthode equals compare la valeur des deux chaînes, l'opérateur d'égalité compare les références. Dans mon exemple, je voulais justement montrer que lorsque l'on utilise plusieurs fois un littéral chaîne de caractère, on fait en fait référence au même objet.
QuentinC a écrit :
aussi parce que l'opértaeur d'égalité du java vérifie une égalité stricte ce qui n'est pas le cas de javascript si on ne met que deux =. Enfin je peux me tromper mais je crois que c'est pour ça.
L'opérateur d'égalité en JavaScript compare lui les valeurs (pour le type String en tout cas). Si on met trois =, il ne fait pas de conversion de type.
Modifié par Eldebaran (19 Dec 2006 - 19:33)