Avatar billede nicklasb Nybegynder
26. september 2004 - 16:52 Der 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.
Avatar billede roenving Novice
26. september 2004 - 17:09 #1
F.eks.

<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>

<script language="javascript" type="text/javascript" src="tom.js"></script>

<form id="minForm" name="minForm">
<button name="button" id="button" onclick="alert(testTal(this.form.minInput.value));">En ny knap!</button>
<br>
<input id="minInput" name="minInput" type="text" value="8" onfocus="if(this.value==this.defaultValue)this.value='';" onblur="if(this.value=='')this.value=this.defaultValue;" size="20">
</form>
Avatar billede nicklasb Nybegynder
26. september 2004 - 17:19 #2
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.)
Avatar billede bamig Nybegynder
26. september 2004 - 17:27 #3
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;
Avatar billede roenving Novice
26. september 2004 - 17:30 #4
Du skrev jo, at den skulle være imellem !-)

-- 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 !-)
Avatar billede roenving Novice
26. september 2004 - 17:34 #5
Hov, jeg fik ikke rettet linjen, fordi jeg mentalt var langt inde i teksten under, men det har bamig jo også gjort !-)
Avatar billede nicklasb Nybegynder
26. september 2004 - 17:40 #6
den er bare i vinkel ;)

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;

lig lige ved samme lejlighed!
Avatar billede nicklasb Nybegynder
26. september 2004 - 17:40 #7
edit: lig lige et svar ved samme lejlighed!
Avatar billede roenving Novice
26. september 2004 - 17:56 #8
I den linje står der:

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]

-- velbekomme '-)
Avatar billede roenving Novice
26. september 2004 - 17:59 #9
-- og tak for point ;~}
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester