Avatar billede ninjadims Nybegynder
30. september 2001 - 13:32 Der er 17 kommentarer og
1 løsning

Hjælp mig please(datoprogram)

Hej jeg er ved at lave et script som kan finde ud af hvor mange dage der er til ens fødselsdag. Men jeg kan ik rigtigt få skidtet til at virke. Når jeg printer resultatet ud står der NaN(NotaNumber)i vinduet. JEg har efterhånden prøvet ALT og jeg fatter simpelthen ikke hvad der er galt. Jeg vil være utrolig taknemlig hvis der er en der kan fortælle mig hvad der er galt med denne kode. Tak
P.S. kommentarene er nogle jeg lige har skrevet, så det er ik  dem der er problemet.

<html>
<head>
<script LANGUAGE=\"javascript\">

var fdato=window.prompt(\"Indtast fødselsdato her(dd/mm/åååå)\");

mdr=new Array(12);//arrayet indeholder info om antal  dage i måneden
mdr[00]=parseInt(31);
mdr[01]=parseInt(28);
mdr[02]=parseInt(31);
mdr[03]=parseInt(30);
mdr[04]=parseInt(31);
mdr[05]=parseInt(30);
mdr[06]=parseInt(31);
mdr[07]=parseInt(31);
mdr[08]=parseInt(30);
mdr[09]=parseInt(31);
mdr[10]=parseInt(30);
mdr[11]=parseInt(31);


var fdag=parseInt(fdato.substring(0,2));
var fmd=parseInt(fdato.substring(2,4));
var faar=parseInt(fdato.substring(4,8));

nudato=new Date();

var nudag=nudato.getDate();
var numd=nudato.getMonth();
var nuaar=nudato.getFullYear();

var antaldage;

//denne bliver kaldt hvis den aktuelle md. er større end ens føsdagmåned
function efter()
{
var aktueldag=0;

for (i=(numd+1);i<=12;i++)
{
aktueldag=(aktueldag+mdr[i]);
}
for (j=0;j<fmd;j++)
{
aktueldag=(aktueldag+mdr[j]);
}
aktueldag=(aktueldag+((mdr[numd]-nudag)+fdag));
return aktueldag;
}

//denne funk hvis den er aktuelle md. er mindre end føsdagmd.
function foer()
{
var aktueldag=0;
for (k=(numd+1);k<fmd;k++)
{
aktueldag=(aktueldag+mdr[k]);
}
aktueldag=(aktueldag+((mdr[numd]-nudag)+fdag));
return aktueldag;
}

function afgoer()
{
if(numd>fmd)
{
antaldage=efter();
}
if(numd<fmd)
{
antaldage=foer();
}
}
afgoer();

document.write(antaldage);

</script>

</head>
<body>
</body>
</html>

Avatar billede Slettet bruger
30. september 2001 - 13:39 #1
Du har en fejl i dine parseInt()\'s:
var fdag=parseInt(fdato.substring(0,2));
var fmd=parseInt(fdato.substring(2,4));
var faar=parseInt(fdato.substring(4,8));
Skal ændres til:
var fdag=parseInt(fdato.substring(0,2));
var fmd=parseInt(fdato.substring(3,5));
var faar=parseInt(fdato.substring(6,10));
...i dit tilfælde!
Avatar billede Slettet bruger
30. september 2001 - 13:41 #2
I dit script (hvis man undlod parseInt()-kommandoerne) ville variablerne blive udfyldt med:
fdag = \"30\";
fmd = \"/1\";
faar = \"0/20\";
... ved datoen d. 30/10/2001 ! :-)
Avatar billede ninjadims Nybegynder
30. september 2001 - 13:52 #3
jeg har ændret mit parseInt nu, men den siger stadig NaN under kørsel. Har du fået det til at virke hos dig?
Avatar billede anjensen1 Novice
30. september 2001 - 15:10 #4
Hejsa
Det er ofte at parse-operationer driller.
Du kan nemt kontrollere at du får det du gerne vil have ved at lave en lille designalert:

var fdag=parseInt(fdato.substring(0,2));
var fmd=parseInt(fdato.substring(3,5));
var faar=parseInt(fdato.substring(6,10));
alert(fdag+\" | \"+fmd+\" | \"+faar);

Her vil du se at nu bliver daoen formatteret og opdelt korrekt
Huskk og fjern den -før du afleverer opgaven på skolen... ;)


Avatar billede nikolajdu Nybegynder
30. september 2001 - 16:00 #5
var nuaar=nudato.getFullYear();

var nuaar=nudato.getYear();
Avatar billede ninjadims Nybegynder
30. september 2001 - 16:41 #6
Tak for de gode råd indtil videre, men jeg tror ikke i forstod hvad jeg mente. Tallene fad,fmd,nudag osv. Altså alle datotallene, de virker fint nok hver for sig. Men i det samme jeg behandler tallene i mine to funktioner går der noget galt. Jeg snakker om disse funktioner :

function efter()
{
var aktueldag=0;

for (i=(numd+1);i<=12;i++)
{
aktueldag=(aktueldag+mdr[i]);
}
for (j=0;j<fmd;j++)
{
aktueldag=(aktueldag+mdr[j]);
}
aktueldag=(aktueldag+((mdr[numd]-nudag)+fdag));
return aktueldag;
}

function foer()
{
var aktueldag=0;
for (k=(numd+1);k<fmd;k++)
{
aktueldag=(aktueldag+mdr[k]);
}
aktueldag=(aktueldag+((mdr[numd]-nudag)+fdag));
return aktueldag;

Jeg kan altså som sagt sagtens lægge dato tallene sammen og udskrive dem osv hvis jeg ikke har disse to funktioner med. Men i det samme jeg lader tallene behandle i en af disse funktioner, går det galt. Så det er altså et eller andet sted i disse funktioner fejlen ligger. Men jeg kan simpelthen ikke finde ud af hvor.
P.S. Det er forresten ikke en skoleopg. Det er en jeg har defineret til mig selv :)
Avatar billede Slettet bruger
30. september 2001 - 16:48 #7
Udskift de tre parseInt()-sætninger med:

var fdag=parseInt(fdato.substring(0,2));
var fmd=parseInt(fdato.substring(3,5));
var faar=parseInt(fdato.substring(6,10));
if (fdato.charAt(0) == \"0\") fmd = parseInt(fdato.charAt(1));
if (fdato.charAt(3) == \"0\") fmd = parseInt(fdato.charAt(4));
Avatar billede Slettet bruger
30. september 2001 - 16:49 #8
Nu returner de i hvert fald det rigtige resultat, men det ser ud som om, der er et eller andet galt i dit script...
Avatar billede Slettet bruger
30. september 2001 - 16:50 #9
Ups, så ikke dit indlæg, ninjadims!
Avatar billede Slettet bruger
30. september 2001 - 16:51 #10
Når jeg kører dit script med datoen d. 03/09/1987 (en vis hunds fødselsdag!) og med parseInt()-rettelserne, så udskriver den på skærmen: 3
Men der kommer ingen fejlmeddelese...
Avatar billede olebole Juniormester
30. september 2001 - 18:30 #11
<ole>
Prøv at alert\'e dine tal, inden du behandler dem...det kan som regel afsløre fejlen.
Begynd i toppen af de funktioner, der giver dig problemer. Skriv så f.eks:

alert(i+\" : \"+aktueldag+\" : \"+mdr[i]);
aktueldag=(aktueldag+mdr[i]);

Læg så mærke til to ting, når alert\'en kommer frem:
1. Er der en fejl-ikon i din statusbar? Hvis \'ja\', så ér fejlen allerede indtrådt - før linien med alert\'en.
2. Ser de alert\'ede værdier \'fornuftige ud\'?

Hvis alt er OK, flytter du alert\'en ned til næste sted, hvor du foretager dig noget med genererede værdier og tester dem.....osv.
/mvh
</bole>
Avatar billede jakoba Nybegynder
30. september 2001 - 18:37 #12
Når du laver parseint på streng hvor der kan være foranstillede nuller kan det nemt gå galt.

dennem måend er fx den 9\'ende i året så du laver parseInt( \'09\' ); grunden er at funktionen kikker på første ciffer og hvis det er et 0 tror den taller er i ottetalssystemet. (hvor 9 slet ikke er et ciffer).

Du må udtrykkeligt fortælle funktionen at det tal der skal læses er et decimalt tal. Det gøres ved at give en extra parameter med der er 10:
    var fdag=parseInt( fdato.substring(0,2), 10 );
    var fmd=parseInt(  fdato.substring(3,5), 10 );
    var faar=parseInt( fdato.substring(6,10), 10 );

Egentlig unødvendigt ved årstallet, men det skader aldrig.

mvh JakobA
Avatar billede jakoba Nybegynder
30. september 2001 - 18:43 #13
idet du initierer dit mdr array siger du
    mdr[00]=parseInt(31);
den parseInt skader ikke, men den er totalt spild af tid
det med at skrive 2 nuller for at slå op er farligt. især i linierne:
    mdr[08]=parseInt(30);
    mdr[09]=parseInt(31);
af samme grund som ovenfor.

skriv istedet:
    mdr[ 0]=31;
...
    mdr[ 8]=30;
    mdr[ 9]=31;
det er hurtigere og sikrere.

Avatar billede jakoba Nybegynder
30. september 2001 - 21:43 #14
2 logiske rettelser (udover det ovenfor)

1)
du skal trække 1 fra den indtastede måned så månedsnummeret svarer til nummereringen i dine Date objekter ( 0==januar,... 11==december )

2)
i første for-løkke i funktionen  efter()  havde du en forkert betingelse. du testede  12>=i  og det lighedstegn lod i blive 12, men mdr arrayets højeste index er 11.

jeg har rettet begge fejl i koden hernedenfor. og det virker sågar.


var fdag=parseInt( fdato.substring( 0,2 ), 10 );
var fmd =parseInt( fdato.substring( 3,5 ), 10 ) -1; // RETTET LINIE
var faar=parseInt( fdato.substring( 6,10 ), 10 );
alert( \">\"+fdato +\"  \"+fdag+\"  \"+fmd+\"  \"+faar );

nudato=new Date();

var nudag=nudato.getDate();
var numd=nudato.getMonth();
var nuaar=nudato.getFullYear();

var antaldage;

//denne bliver kaldt hvis den aktuelle md. er større end ens føsdagmåned
function efter() {    // fjernet +1 i første loop
    var aktueldag=0;
    for ( i=numd+1; 12>i; i++ ) { // fra nu til nytår  RETTET LINIE
        aktueldag = aktueldag+mdr[i];
    }
    for ( j=0; fmd>j; j++ ) {    // fra nytår til fødemåned
      aktueldag = aktueldag+mdr[j];
    }
    aktueldag= aktueldag +mdr[numd] -nudag +fdag;
    return aktueldag;
}
Avatar billede anjensen1 Novice
01. oktober 2001 - 12:37 #15
glemte noget
før ellersiden får du en løkke som driller
Pas på med at bruge alert metoden i løkker!
Antal step skal holdes LAVT for du kan ikke forlade et skript som alerter inde i en løkke.
Du sidder fast for du kan ikke lukke en alert (er modal) Det er en sur ting at miste et skript fordi man er nødt til at boote
(lignede en skoleopgave.. ;D )
mvh a.
Avatar billede olebole Juniormester
01. oktober 2001 - 12:41 #16
<ole>
Jeg har lavet i om ikke hundredevis, så snesevis af bummerter med en test-alert i en uendelig løkke. Det er da aldrig endt i en reboot - blot tryk Ctrl+Alt+Delete  :)
/mvh
</bole>
Avatar billede jakoba Nybegynder
01. oktober 2001 - 15:17 #17
Oh. Ja naturligvis :-))
men jeg foretrækker nu alligevel min egen patentløsning:

var debugon = true;
function debug( str ) {
    if ( debugon ) debugon = confirm( str );
}; //end debug( string )

og så skriver man debug istedet for alert
    debug(\"X er nu \"+x+\"  Y er nu \"+y);

så trukker man bare chancel når man ikke gider se flere meldinger.
Avatar billede olebole Juniormester
01. oktober 2001 - 20:06 #18
Hehe...ja, vi har vel alle vores egne  :)
Jeg har lavet en \'myAlert()\' i en .js-fil. Den åbner et vindue med test-strengen, da jeg tit sidder med laaaaaange strenge, der skal skrives ud, dynamisk. En alert er for lille til at få skrevet hele strengen på en velformateret måde  :)
/mvh
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