26. september 2004 - 16:52Der er
8 kommentarer og 1 løsning
Opfylder tallet x et eller flere af kravene i anden variabel?
Hej,
Jeg har i variablen tal et helt tal
var tal = 8;
jeg har nu enkelte "krav" til dette tal. Disse består i en samling af følgende: tallet er mindre end x tallet er lig x tallet ligger mellem eller er lig x og y tallet er større end x
lidt lige som en if-sætning. Problemet ligger dog i at disse ranges variere, og de bliver derfor oplyst via en anden variabel
var range = '<2,4,7-9,>12';
(formateringen af range-strengen kan sammensættes som det er lettest og smartest i forhold til scriptet)
Det jeg ønsker er en funktion der kontrollere om tallet tal bliver opfyldt ved kravene i range.
<script language="javascript" type="text/javascript"> var tal = 8; /* jeg har nu enkelte "krav" til dette tal. Disse består i en samling af følgende: tallet er mindre end x tallet er lig x tallet ligger mellem eller er lig x og y tallet er større end x
lidt lige som en if-sætning. Problemet ligger dog i at disse ranges variere, og de bliver derfor oplyst via en anden variabel */ var range = '<2,4,7-9,>12';
function testTal(val){ var res = false,r,m; var ra = range.split(","); for(i=0;ra.length>i;i++){ if(ra[i].match(/<|>/))res = res || eval(val+ra[i]); else if(!ra[i].match(/-/))res = res || val == +ra[i]; else{ r = ra[i].split("-"); for(j=0;r.length>j;j++)r[j] = +r[j]; if(r[0]>r[1])r = r.reverse; res = res || val>r[0]&&r[1]>val; } } return res; } </script>
Det virker jo fremragende. Eneste fejl jeg lige kan komme på, er hvis tallet er lig 7 eller 9. Der returnere den false.
Gid jeg forstod hvad det er du har lavet i testTal -funktionen! ;) (forstår foreksemepel ikke lige umidbart hvorfor du har deklereret variablen res og sat den lig false,r,m osv.)
7 og 9 returnere false fordi at scriptet kun ser på tallene mellem dem. Hvis du vil have det til at tage 7 og 9 med skal linjen: res = res || val>r[0]&&r[1]>val; laves om til res = res || val>=r[0]&&r[1]>=val;
-- hvis den godt må være lig med skal der tilføjes to lighedstegn:
res = res || val>r[0]&&r[1]>val;
Fra en ende af:
Jeg deklarerer 3 variable, res, r og m for at være sikker på, at de ikke overtager værdier fra andre scripts (eller overskriver !-)
-- og res får en default-value, for ellers kan jeg ikke være ligeglad med rækkefølgen af tal i range (hvilket jeg har lavet funktionen til at være, så den kunne også hedde: var range = '<2,>12,4,9-7';)
Først splittes range, så jeg har de forskellige kriterier for sig, så sammenligner jeg en for en ...
Først undersøger jeg om den konkrete er en større end eller mindre end, hvis den er det skrives den direkte sammen og beregnes via eval,
Dernæst om det _ikke_ er et interval, så sammenlignes der bare (for en sikkerheds skyld typecaster jeg range-variablen til et tal !-)
Hvis det er et interval splittes den op i de to værdier, de typecastes til tal, og jeg undersøger om intervallet skulle være baglæns, så jeg kan nå at vende det først ...
Hver gang sætter jeg logisk eller med res-værdien, så hvis bare een er sand returnerer den sand !-)
det var mest grunden til deklereringen der var problemet! .. og så lige hvad || betyder midt i en linie som foreksempel?? res = res || val>r[0]&&r[1]>val;
Sæt værdien af res til sand eller falsk (true eller false) afhængig af om res i forvejen er sand _eller_ værdien af val er både større end r[0] _og_ mindre end r[1] ...
Så || betyder logisk eller, mens && betyder logisk og (både og !-) og && eksekveres først, så det kan skrives uden at bruge paranteser !o]
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.