/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
Problem med skudår
Fra : Jimmy


Dato : 22-01-04 13:25

Hey

Har fået bakset nedenstående udemærkede stykke kode sammen. Funktionen
tester en dato der bliver tastet ind i et vindue og returnerer true hvis det
er en gyldig dato, og false hvis ikke.

Problemet er nu, at der ikke tages højde for skudår. 29-02-2004 vil
resultere i return false.

Hvordan kan jeg løse dette?

Er der i det hele taget ikke en smartere måde at checke for om en dansk dato
er valid, end dette kæmpescript?

function check_date(objekt){
fejl = 0
if (document.all(objekt).value.length != 10)
fejl = 1
else {
maaned = document.all(objekt).value.charAt(3) +
document.all(objekt).value.charAt(4)
for (tegn = 0 ; tegn < 11 ; tegn++) {
felt_tegn = document.all(objekt).value.charAt(tegn)
if (tegn == 0) {
if ((felt_tegn < "0" || felt_tegn > "3") || felt_tegn == "")
fejl = 1
}
if (tegn == 1) {
forrige_tegn = document.all(objekt).value.charAt(tegn - 1)
if (forrige_tegn == "3") {
if (maaned == "01" || maaned == "03" || maaned == "05" || maaned
== "07" || maaned == "08" || maaned == "10" || maaned == "12"){
if ((felt_tegn < "0" || felt_tegn > "1") || felt_tegn == "")
fejl = 1
}
else if (maaned == "04" || maaned == "06" || maaned == "09" ||
maaned == "11"){
if (felt_tegn != "0" || felt_tegn == "")
fejl = 1
}
else if (maaned == "02")
fejl = 1
}
else if (forrige_tegn == "2") {
if (maaned == "02"){
if ((felt_tegn < "0" || felt_tegn > "8") || felt_tegn == "")
fejl = 1
}
}
else if (forrige_tegn == "0") {
if (felt_tegn == "0")
fejl = 1
}
if ((felt_tegn < "0" || felt_tegn > "9") || felt_tegn == "")
fejl = 1
}
if (tegn == 2)
if(felt_tegn != "-")
fejl = 1
if (tegn == 3)
if ((felt_tegn < "0" || felt_tegn > "1") || felt_tegn == "")
fejl = 1
if (tegn == 4){
forrige_tegn = document.all(objekt).value.charAt(tegn - 1)
if (forrige_tegn == "1") {
if ((felt_tegn < "0" || felt_tegn > "2") || felt_tegn == "")
fejl = 1
}
else if (forrige_tegn == "0") {
if (felt_tegn == "0")
fejl = 1
}
if ((felt_tegn < "0" || felt_tegn > "9") || felt_tegn == "")
fejl = 1
}
if (tegn == 5)
if(felt_tegn != "-")
fejl = 1
if (tegn == 6)
if ((felt_tegn < "1" || felt_tegn > "2") || felt_tegn == "")
fejl = 1
if (tegn == 7)
if ((felt_tegn != "9" && felt_tegn != "0") || felt_tegn == "")
fejl = 1
if (tegn == 8 || tegn == 9)
if ((felt_tegn < "0" || felt_tegn > "9") || felt_tegn == "")
fejl = 1
}
}
if (fejl){
alert(document.all("errortext1").value)
return false
}
if (!fejl)
return true
}


Jimmy



 
 
Jens Gyldenkærne Cla~ (22-01-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 22-01-04 16:25

Jimmy skrev:

> Problemet er nu, at der ikke tages højde for skudår.
> 29-02-2004 vil resultere i return false.
>
> Hvordan kan jeg løse dette?

Brug javascripts indbyggede Date-objekt - det kender til skudår.

> Er der i det hele taget ikke en smartere måde at checke for om
> en dansk dato er valid, end dette kæmpescript?

Her er et eksempel:


function getYear(d) {
return (d < 1000) ? d + 1900 : d;
}

function isDate (year, month, day) {
// month argument must be in the range 1 - 12
month = month - 1; // javascript month range : 0- 11
var tempDate = new Date(year,month,day);
if ( (getYear(tempDate.getYear()) == year) && (month ==
tempDate.getMonth()) && (day == tempDate.getDate()) ) {
return true;
} else {
return false;
}
}

function testDate(theDate){
   var reg = /(\d{1,2})\W(\d{1,2})\W(\d{4})/;
   var svar = false;
   if (reg.test(theDate)){
      var fdato = theDate.replace(reg, "$1-$2-$3");
      var dArray = fdato.split("-");
      return (isDate(dArray[2], dArray[1], dArray[0]));
   } else {
      return false;
   }
}
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jimmy (26-01-2004)
Kommentar
Fra : Jimmy


Dato : 26-01-04 13:47

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> skrev i en meddelelse
news:Xns9478A6F6F2D94jcdmfdk@gyrosmod.dtext.news.tele.dk...
> Jimmy skrev:
> > Er der i det hele taget ikke en smartere måde at checke for om
> > en dansk dato er valid, end dette kæmpescript?
>
> Her er et eksempel:

Perfekt. Tak :)

Har dog lige et par spørgsmål

>
> function getYear(d) {
> return (d < 1000) ? d + 1900 : d;
> }

Hvis nu man skriver 29-01-01, i stedet for 29-01-2001, vil det så ikke være
det forkerte årstal den returnerer?

> function testDate(theDate){
> var reg = /(\d{1,2})\W(\d{1,2})\W(\d{4})/;

Her står jeg af. Hvad er det egentlig het præcist der sker her?

> var svar = false;
> if (reg.test(theDate)){
> var fdato = theDate.replace(reg, "$1-$2-$3");
> var dArray = fdato.split("-");

reg.test??? Hvor får vi test fra? Hvad gør den?
$1-$2-$3??? Jeg er ikke helt med?

Kan forstå at split deler værdierne op således at du bruger "-" som tegn til
at det skal i hvert deres variabel i Arrayet.

> return (isDate(dArray[2], dArray[1], dArray[0]));
> } else {
> return false;
> }
> }

Håber ikke at vi er helt på begynder niveau her. Resten forstår jeg, og
samtidig virker det 100% efter hensigten så vidt jeg har kunnet konstatere
:)

Your the man

Jimmy



Jens Gyldenkærne Cla~ (26-01-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 26-01-04 14:06

Jimmy skrev:

>> function getYear(d) {
>> return (d < 1000) ? d + 1900 : d;
>> }
>
> Hvis nu man skriver 29-01-01, i stedet for 29-01-2001, vil det
> så ikke være det forkerte årstal den returnerer?

Jo. Man kan selvfølgelig skrive 2000 i stedet, men så giver det
problemer hvis der er nogen der mener 19xx. I det aktuelle script
er funktionen dog overflødig - se nedenfor.

>
>> function testDate(theDate){
>> var reg = /(\d{1,2})\W(\d{1,2})\W(\d{4})/;


Udtrykket mellem de to skråstreger er et regulært udtryk (regex).
\d betyder et ciffer og efterstillede tal i tuborgklammer bestemmer
hvor mange cifre der må være. \d{4} betyder derfor præcis fire
cifre, mens \d{1,2} betyder mindst 1 og højst to cifre.
\W betyder et ikke-ord-tegn (ikke et tal eller et bogstav). Her er
det i praksis det samme som et skilletegn.

Udtrykket "\d{1,2}\W\d{1,2}\W\d{4}" skal derfor læses:

   1 eller 2 cifre + et skilletegn + 1 eller 2 cifre +
   et skilletegn + 4 cifre.

Parenteserne bruges til at gemme værdier i variable, sådan så man
kan bruge dem senere. For hver parentes oprettes der en variabel
med navnet $x, hvor x er et tal der afspejler parentesens placering
i udtrykket. I eksemplet herover er $1 derfor den tekst der matches
af det første \d{1,2} (dvs. datoen), $2 er tilsvarende måneden og
$3 er årstallet.


>> var svar = false;
>> if (reg.test(theDate)){

..test-metoden undersøger om argumentet (datoen) passer med det
format der er angivet i regex'et. Der returneres sandt eller falsk.

>> var fdato = theDate.replace(reg, "$1-$2-$3");

Her omformes datoen så til et fast format.

>> var dArray = fdato.split("-");

Og split-metoden skiller så datoen i de tre dele dag, måned og år.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jimmy (26-01-2004)
Kommentar
Fra : Jimmy


Dato : 26-01-04 14:21

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> skrev i en meddelelse
news:Xns947C8F778DC4Bjcdmfdk@gyrosmod.dtext.news.tele.dk...
> Jimmy skrev:

Ok, så er jeg helt med. Perfekt! Tak for hjælpen :)


Jimmy



Lasse Reichstein Nie~ (26-01-2004)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 26-01-04 18:55

Jens Gyldenkærne Clausen <jens@gyros.invalid> writes:

>>> if (reg.test(theDate)){
>
> .test-metoden undersøger om argumentet (datoen) passer med det
> format der er angivet i regex'et. Der returneres sandt eller falsk.
>
>>> var fdato = theDate.replace(reg, "$1-$2-$3");
>
> Her omformes datoen så til et fast format.
>
>>> var dArray = fdato.split("-");
>
> Og split-metoden skiller så datoen i de tre dele dag, måned og år.

Lidt omstændigt at teste, replace og så splitte, når du jo har fundet
$1-$3 allerede ved første test. Du kunne "nøjes" med

var dArray = reg.exec(theDate); // hvis match så = [theDate,dag,md,år]
if (dArray!=null) {
dArray = dArray.slice(1); // hvis du vil af med dArray[0], ellers brug
// dArray[1]-dArray[3]
...

/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Jens Gyldenkærne Cla~ (26-01-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 26-01-04 20:38

Lasse Reichstein Nielsen skrev:

> Lidt omstændigt at teste, replace og så splitte, når du jo har
> fundet $1-$3 allerede ved første test.

Jeg forsøgte oprindelig med at bruge $1-3 efter udførelsen af test-
metoden, men det virkede ikke.


> var dArray = reg.exec(theDate); // hvis match så =
> [theDate,dag,md,år]

Lækkert.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste