[Javascript/RegExp] Controle op achter de comma getallen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste Mensen,

Dit is mijn eerste echte post op het forum dus ik hoop dat ik het goed doe.

Ik zal beginnen met het uitleggen wat ik wil bereiken.

Ik heb een input field waar mensen "uren" in kunnen vullen. Ik wil dat doen in het volgende formaat: 1,25 voor een uur en een kwartier en 2,75 voor twee uur en drie kwartier.

Nu wil ik graag dat gebruikers alleen x,25 x,50 of x,75 in vullen. Momenteel gebruik ik het volgende stuk RegExp code om dit te controleren.
code:
1
^\\d+(?:(.|,)?[0,2,5,7][0,5])?$

Zoals sommige mensen waarschijnlijk gelijk zien sta ik ook een punt toe in plaats van een comma.

Mijn probleem is nu dat ik ook combinaties kan maken van bijvoorbeeld x,05, x,20 etc.

Mijn vraag is dus hoe ik dit stukje regexp aan pas zodat hij die waarden niet accepteert en dus alleen de 25 50 en 75 hapt.

Ik heb lopen zoeken op het internet maar ik snap hem niet meer. Wellicht is het een heel eenvoudige aanpassing maar ik kom er dus niet uit.

Alvast bedankt voor de reacties en als er op/aan merkingen zijn hoor ik het graag.

Met vriendelijke groet,
Tom

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

[25|50|75], eventueel nog gevolgd door een |00?

[ Voor 57% gewijzigd door CodeCaster op 26-10-2011 15:23 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik dit doe:
code:
1
^\\d+(?:(.|,)?[25|50|75|00])?$

dan zijn de correcte opties die ik kan maken ook: 0,7 etc maar een dubbele achter de comma snapt hij dan niet meer.

Ik heb juist dit
code:
1
[0,2,5,7][0,5]

gedaan omdat hij 2 cijfers achter de komma moet hebben.

Acties:
  • 0 Henk 'm!

  • Leftblank
  • Registratie: Juni 2004
  • Laatst online: 15:53
De '.' in (.|,) zul je nog wel moeten escapen verwacht ik, dus \.|, ervan maken. Met een punt sta je namelijk elk teken toe, terwijl je nu echt een punt zoekt.

Kun je in z'n geheel niet volstaan met het volgende:
code:
1
^\d+(?:[\.,](00|25|50|75))?$

Op die manier heb je de mogelijke combinaties staan van "een geheel getal gevolgd door punt of komma en een van de kwart-opties". Hiermee zul je vervolgens nog niet netjes het getal als match terugkrijgen maar gezien je eerdere expressie leek dit geen vereiste.

[ Voor 55% gewijzigd door Leftblank op 26-10-2011 15:36 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28
Kun je de input niet gewoon parsen naar float? Dan maakt het niet meer uit wat mensen invullen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Leftblank schreef op woensdag 26 oktober 2011 @ 15:27:
De '.' in (.|,) zul je nog wel moeten escapen verwacht ik, dus \.|, ervan maken. Met een punt sta je namelijk elk teken toe, terwijl je nu echt een punt zoekt.
Bedankt voor de tip. Hier had ik helemaal niet aan gedacht. Dit ga ik even checken.
Bosmonster schreef op woensdag 26 oktober 2011 @ 15:36:
Kun je de input niet gewoon parsen naar float? Dan maakt het niet meer uit wat mensen invullen.
Als ik dan parseFloat("1,70") doe dan is de output toch nog steeds 1,70? Dat is niet wat ik zoek volgens mij of ik begrijp je verkeerd.

[ Voor 32% gewijzigd door Verwijderd op 26-10-2011 15:42 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
edit.. alles even in 1 reply gezet

[ Voor 92% gewijzigd door Verwijderd op 26-10-2011 15:42 ]


Acties:
  • 0 Henk 'm!

  • Leftblank
  • Registratie: Juni 2004
  • Laatst online: 15:53
Verwijderd schreef op woensdag 26 oktober 2011 @ 15:39:
[...]

Als ik dan parseFloat("1,70") doe dan is de output toch nog steeds 1,70? Dat is niet wat ik zoek volgens mij of ik begrijp je verkeerd.
Je zou dan nog even kunnen goochelen met modulo ((getal % 1) % 0.25 != 0 => fout) en op die manier de input afvangen, dat heeft weer als nadeel dat je als nog zelf rekening moet houden met de punt ipv komma voor de decimaal.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Leftblank schreef op woensdag 26 oktober 2011 @ 15:42:
[...]

Je zou dan nog even kunnen goochelen met modulo ((getal % 1) % 0.25 != 0 => fout) en op die manier de input afvangen, dat heeft weer als nadeel dat je als nog zelf rekening moet houden met de punt ipv komma voor de decimaal.
Het is voor redelijk "geavanceerde" gebruikers dus als ik zeg dat het met een punt moet dan doen ze dat over het algemeen wel. De komma is puur voor het mooi zijn. Het gaat me er inderdaad puur om dat het 1 altijd i van de kwart opties is.

Dit is wel de moeite waard om eens in te duiken.

[ Voor 4% gewijzigd door Verwijderd op 26-10-2011 15:49 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
[b][message=37009662,noline]...
code:
1
^\d+(?:[\.,](00|25|50|75))?$

Op die manier heb je de mogelijke combinaties staan van "een geheel getal gevolgd door punt of komma en een van de kwart-opties". Hiermee zul je vervolgens nog niet netjes het getal als match terugkrijgen maar gezien je eerdere expressie leek dit geen vereiste.
Ik had dit getest maar ik dacht dat het niet werkte. Ik was vergeten dat ik in javascript wat extra escapes moet doen..

Dit is voor mij de oplossing

code:
1
var reg = new RegExp("^\\d+(?:[\\.,](00|25|50|75))?$");


Bedankt voor de hulp bij deze n00b vraag :)

[ Voor 3% gewijzigd door Verwijderd op 26-10-2011 16:02 ]


Acties:
  • 0 Henk 'm!

  • noes
  • Registratie: Augustus 2006
  • Niet online

noes

gek op benzine.

Verwijderd schreef op woensdag 26 oktober 2011 @ 15:55:
[...]


Ik had dit getest maar ik dacht dat het niet werkte. Ik was vergeten dat ik in javascript wat extra escapes moet doen..
Je kan ook je regex zo definieren, dan hoeft het niet:
code:
1
var rex = /^\\d+(?:(.|,)?[0257][05])?$/i;


mijn idee:
code:
1
 var rege =  /^\d{0,2}([,.:](25|50|75|[0]{1,2}))?$/;
Waarbij ik er vanuitga dat je max 2 cijfers voor de punt, komma of dubbele punt wil toestaan en het mogelijk wil malen op 'amerikaanse' stijl 0,75 in te voeren: '.75' . Vervolgens wil je alleen een scheidingsteken toestaan als je ook een getal achter de komma in wil voeren. Hierna mag je 25,50,75,0 of 00 invoeren.

Maar je kan m ook dmv parsfloat en mod oplossen, is iets makkelijker.

K54/R1250RS | K48/K1600GT | E61/550i


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28
Verwijderd schreef op woensdag 26 oktober 2011 @ 15:37:
[...]

Als ik dan parseFloat("1,70") doe dan is de output toch nog steeds 1,70? Dat is niet wat ik zoek volgens mij of ik begrijp je verkeerd.
Ik zou me daar aan de frontend uberhaupt niet druk over maken, maar dat terzijde. Parsen naar float geeft je in ieder geval een rekenbare value. Vervolgens kun je met een eenvoudige modulo kijken of het een veelvoud is van 0,25 natuurlijk.

Je bent nu string-validatie aan het toepassen op een rekenkundig probleem.
Pagina: 1