Avatar billede kimlarsen1978 Nybegynder
07. marts 2004 - 23:39 Der er 10 kommentarer og
1 løsning

Intelligent dato validering

Heysa
Er der nogle der kender en "Intelligent" metode til at validerer datoer med?:

Datoen angives i en "form text indput" som en streng og funktionen kører på "on change". Datoen skal i sidste ende retuneres på formen DD-MM-YYYY. Funktionen skal kunne håndterer forskellige formater som indput. Lidt lige som Excel kan regne forskellige indput ud i et datofelt.

Den funktion jeg har lavet gør det at den fjerner alle tegn som ikke er tal og kører så en række cases alt efter længende af den streng som er tilbage. Hvor jeg så har forsøgt at "regne ud" hvad brugeren kunne mene. Det viker bestem ikke særligt godt!

Så jeg vil gerne hvis der er én eller flere der ved hvordan man kan lave en datovalidering som er intelligent lige som i fx. excel.

Indput feltet har disse begræsninger:
- streng
- MAX længde 10

Ingen datoer angives med bogstaver fx. 12 dec 2004 findes IKKE som muligt indput. bindestreg(-) og punktum(.) må godt indtastes. Det skal funktionen kunne håndterer.

Jeg søger altså en funktion som tager en STRENG som indput og som "intellegent" retunere en dato på formen DD-MM-YYYY og en alert hvis den ikke finder en.

Er problemet klart nok?
Avatar billede roenving Novice
08. marts 2004 - 00:25 #1
Her er de fleste muligheder vist med, men du kan jo prøve at finde nogle flere til udbygning af scriptet !-)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Check datoer</title>
<meta name="keywords" content="roenving,http://www.eksperten.dk/spm/474415">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
</style>
<script language="javascript" type="text/javascript">
function checkDato(dato){
  var reg = /[ \.\/]/g,tmp;
  var val = dato.replace(reg, "-");
  if(val.indexOf("-")==-1||!val.match(/[\d-]{4,10}/))return dato;
  val = val.split("-");
  if(val.length!=3)return dato;
  for(i=0;val.length>i;i++)val[i] = +val[i];
  if(val[2]<31&&val[0]>31){
    tmp = val[0];
    val[0] = val[2];
    val[2] = tmp;
  }
  if(val[0]<12&&val[1]>12){
    tmp = val[0];
    val[0] = val[1];
    val[1] = tmp;
  }
  val[2] += (val[2]>100)?0:(70>val[2])?2000:1900;
  var dat = new Date(val[2], val[1]-1, val[0]);
  if(dat.getYear()!=val[2]&&dat.getFullYear()!=val[2]||dat.getMonth()+1!=val[1]||dat.getDate()!=val[0])return dato;
  return ((val[0]>9)?"":"0") + val[0] + "-" + ((val[1]>9)?"":"0") + (val[1]) + "-" + dat.getFullYear();
}

</script>
</head>
<body>
<br>
<form id="minForm" name="minForm">
<input id="minInput" name="minInput" type="text" value="Indtast dato" onchange="alert(checkDato(this.value))" onfocus="if(this.value==this.defaultValue)this.value='';" onblur="if(this.value=='')this.value=this.defaultValue;" size="20">
<br>
</form>
</body>
</html>
Avatar billede kimlarsen1978 Nybegynder
08. marts 2004 - 08:25 #2
Heysa
Den giver denne fejl:
---------

---------
på denne linie:
----------
var val = dato.replace(reg, "-");
----------
Error: 'undefined' is null or not an object
----------
Skal jeg lave en
var dato = new Date();?
Avatar billede kimlarsen1978 Nybegynder
08. marts 2004 - 08:31 #3
Ups :)
Den giver denne fejl:
---------
Error: 'undefined' is null or not an object
---------
på denne linie:
----------
var val = dato.replace(reg, "-");
----------
Skal jeg lave en
var dato = new Date();?
Avatar billede kimlarsen1978 Nybegynder
08. marts 2004 - 13:17 #4
Hej igen
Jeg har fået det første problem løst :)
Men den reagerer ikke på indputsom fx 03122004 som gerne skulle blibe til 03-12-2004. Men der kan jeg evt. lave noget kode til if delene som håndterer de tilfælde hvor den pt giver op - det kigger jeg lige på :)

Men jeg ville gerne hvis du ville sætte en masse gode kommentarer ind i scriptet, for det er ikke lavet helt på samme måde som jeg ellers er vandt til. Jeg vil nemlig gerne lære noget nyt :)
Takker
Avatar billede roenving Novice
08. marts 2004 - 13:45 #5
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Check datoer</title>
<meta name="Generator" content="Stone's WebWriter 4">
<meta name="keywords" content="roenving,http://www.eksperten.dk/spm/474415">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
</style>
<script language="javascript" type="text/javascript">
function checkDato(dato){
  var reg = /[ \.\/]/g,tmp;
  var val = dato.replace(reg, "-");//erstat alle punktummer og mellemrum med -
  if(dato.match(/^\d{8}$/))val = dato.substring(0,2)+"-"+dato.substring(2,4)+"-"+dato.substring(5);//8 cifre fortolkes som en dato
  if(val.indexOf("-")==-1||!val.match(/[\d-]{4,10}/))return dato;//Hvis der ikke er bindestreger eller strengen er kortere end 4 eller længere end 10 tegn, kan vi ikke oversætte
  val = val.split("-");//Del værdien op i tre dele ved bindestregerne
  if(val.length!=3)return dato;//Hvids der ikke er 3 værdier kan vi ikke oversætte
  for(i=0;val.length>i;i++)val[i] = +val[i];//Konverter værdier til tal
  if(val[2]<31&&val[0]>31){//Hvis første tal er større end 31, må det være åå(åå)-mm-dd, byt dato og år
    tmp = val[0];
    val[0] = val[2];
    val[2] = tmp;
  }
  if(val[0]<12&&val[1]>12){//Hvis anden værdi er større end 12 og første er mindre, må det være mm-dd-åå(åå)
    tmp = val[0];
    val[0] = val[1];
    val[1] = tmp;
  }
  val[2] += (val[2]>100)?0:(70>val[2])?2000:1900;//Hvis 3. værdi er tocifret skal den reguleres til rette århundrede (her 1970-2069 !-)
  var dat = new Date(val[2], val[1]-1, val[0]);
  if(dat.getYear()!=val[2]&&dat.getFullYear()!=val[2]||dat.getMonth()+1!=val[1]||dat.getDate()!=val[0])return dato;//Hvis ikke resultatet er en reel dato opgiver vi
  return ((val[0]>9)?"":"0") + val[0] + "-" + ((val[1]>9)?"":"0") + (val[1]) + "-" + dat.getFullYear();
}

</script>
</head>
<body>
<br>
<form id="minForm" name="minForm">
<input id="minInput" name="minInput" type="text" value="Indtast dato" onchange="alert(checkDato(this.value))" onfocus="if(this.value==this.defaultValue)this.value='';" onblur="if(this.value=='')this.value=this.defaultValue;" size="20">
<br>
</form>
</body>
</html>
Avatar billede kimlarsen1978 Nybegynder
11. marts 2004 - 09:03 #6
Heysa igen
Kan du her til sidst give en forklring på hvorfor

if(dat.getYear()!=val[2]&&dat.getFullYear()!=val[2]||dat.getMonth()+1!=val[1]||dat.getDate()!=val[0])return dato;

tager højde for skudår når man kun tjekker på værdier enkelt vis?

Det er sammenhængende mellem

var dat = new Date(val[2], val[1]-1, val[0]);
if(dat.getYear()!=val[2]&&dat.getFullYear()!=val[2]||dat.getMonth()+1!=val[1]||dat.getDate()!=val[0])return dato;

jeg mangler.

Hvorfor virker det?
Avatar billede kimlarsen1978 Nybegynder
11. marts 2004 - 09:10 #7
Jeg kunne også godt tænke mit at vide hvorfor

  for(i=0;val.length>i;i++){
    val[i] = +val[i];
  }

konvaterer værdierne til tal?
Avatar billede roenving Novice
11. marts 2004 - 13:42 #8
Det virker, fordi et javascript Date-objekt kun kan returnere værdier, som repræsenterer gyldige datoer, så hvis du f.eks. har skrevet 31/4, vil Date-objektet returnere 1 i getDate() og 4 (altså maj's index) i getMonth(), fordi datoen ikke eksisterer !-)

Fordi et unary + konverterer ...

-- og så velbekomme '-)
Avatar billede roenving Novice
11. marts 2004 - 13:43 #9
-- og måske den tilføjelse, at konverteringen kun sker problemfrit, hvis strengen indeholder et gyldigt tal !-)

-- der returnerer parseInt og -Float da altid et tal !o]
Avatar billede kimlarsen1978 Nybegynder
11. marts 2004 - 14:48 #10
Hey
Jeg takker for store din hjælp :)
Avatar billede roenving Novice
11. marts 2004 - 15:01 #11
-- og jeg takker for points ;~}
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