Groups | Search | Server Info | Keyboard shortcuts | Login | Register


Groups > fr.comp.lang.javascript > #2992

Re: tester un nombre inférieur ou égal à 1 ?

From Olivier Miakinen <om+news@miakinen.net>
Newsgroups fr.comp.lang.javascript, fr.comp.lang.regexp
Subject Re: tester un nombre inférieur ou égal à 1 ?
Followup-To fr.comp.lang.regexp
Date 2016-05-22 20:12 +0200
Organization There's no cabale
Message-ID <nhsspr$1cgo$1@cabale.usenet-fr.net> (permalink)
References <nhrqeq$dg6$1@shakotay.alphanet.ch>

Cross-posted to 2 groups.

Followups directed to: fr.comp.lang.regexp

Show all headers | View raw


Bonjour,

Le 22/05/2016 10:26, Une Bévue a écrit sur fr.comp.lang.regexp seul,
avec suivi vers fr.comp.lang.javascript :
> je valide une opacité [0, 1]

Tout d'abord, attention au fait que tu as oublié de faire un crosspost
avec le groupe que tu as choisi pour le suivi : si quelqu'un te répond
sans faire attention, sa réponse apparaîtra dans un groupe où la
question n'était pas posée !

En outre cette question et ses réponses sont beaucoup plus en charte
sur fr.comp.lang.regexp, même si le fait que tu utilises les regexp de
JavaScript sont une information utile, voire indispensable. Du coup,
je fais le crosspost dans les deux groupes mais je place le suivi vers
là où ma réponse sera en charte, donc fr.comp.lang.regexp.

> les formes valides :
> 
> 000, 0.00012, 1, 1.0, 1.000000
> 
> invalides :
> 
> 1.000002, 2. etc

Ok.

Je suppose que tu as une bonne raison pour ne pas tout simplement
transformer la chaîne en nombre, puis tester si ce nombre est
compris entre 0 et 1 ?

> ma regex actuelle :
> 
> var rr = /^0*1\.?0*|0+\.?[0-9]*$/;

Je vois plusieurs problèmes.

Le premier, c'est que tu testes l'ancrage à gauche seulement pour
le nombre 1, et l'ancrage à droite seulement pour les nombres
strictement inférieurs à 1 (du moins dans l'intention).

Pour factoriser le ^ et le $ le plus simple est d'ajouter une paire
de parenthèses autour de l'alternative :

  /^(0*1\.?0*|0+\.?[0-9]*)$/

Le deuxième problème, c'est que tu testes la présence du point
décimal indépendamment de la présence des chiffres /censés/ être
après ce point décimal. Du coup, les valeurs '100' et '099' vont
être acceptées par ta regexp alors qu'elles sont manifestement
plus grandes que 1.

Je propose :

  /^(0*1(\.0*)?|0+(\.[0-9]*)?)$/

> mes différents tests :
> 
> [...]
> 
> [Debug] setRgbaVal -> rr.test('1') = true (colorwheel.html, line 187)
> [Debug] setRgbaVal -> rr.test('2') = false (colorwheel.html, line 188)
> [Debug] setRgbaVal -> rr.test('1.000') = true (colorwheel.html, line 189)
> [Debug] setRgbaVal -> rr.test('1.003') = true (colorwheel.html, line 190)
> [Debug] setRgbaVal -> rr.test('0.1234') = true (colorwheel.html, line 191)
> [Debug] setRgbaVal -> rr.test('0.00000000') = true (colorwheel.html, 
> line 192)
> [Debug] setRgbaVal -> rr.test('0') = true (colorwheel.html, line 193)
> [Debug] setRgbaVal -> rr.test('00000') = true (colorwheel.html, line 194)
> 
> ça marche "assez" bien excepté un cas :
> 
> rr.test('1.003') = true
> 
> qui devrait me donner false.

Problème numéro 1.

> [...]
> 
> le "^" au début et le "$" à la fin impliquent que toute la chaine est 
> testée.
> 
> où est mon erreur ?

Cf. supra. Mais dans ta série de tests tu avais aussi oublié des chaînes
telles que '099' et '100'.

Cordialement,
-- 
Olivier Miakinen

« Au fond, diviser par zéro revient à unifier la Mécanique Quantique
et la Relativité Générale. » -- M.A. le 7/3/2016 dans fr.sci.maths

Back to fr.comp.lang.javascript | Previous | Next | Find similar


Thread

Re: tester un nombre inférieur ou égal à 1 ? Olivier Miakinen <om+news@miakinen.net> - 2016-05-22 20:12 +0200

csiph-web