Avatar billede mickiii Nybegynder
06. september 2005 - 18:59 Der er 13 kommentarer og
1 løsning

Beregning af dato

Hey,

Har følgende lille funktion:
    <script language="javascript">
    var date = '01-01-2005';
    var payment_term = 'LM10D';
function calculate_paymentdate(date, payment_term) {
    var monthdays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);//Dage i måneder
    var arr = payment_term.split(/(\d+)/g);//Splitter betalingsbetingelsesstreng
    var curr_date = date.split("-");//Splitter givne dato
    var year = curr_date[2];//Givne år
    var month = curr_date[1]-1;//Givne måned
    var day = curr_date[0];//Givne dag
    if(arr[0] == 'LM') {//Hvis 'Løbende måned'
    var date = new Date(year,month,day);//Givet dato, formatteret JS style
      DaysInThisMonth = monthdays[month];//Dage i givne måned
      if (month == 1) { if (year%400==0 || (year%4 == 0 && year%100!=0) ) DaysInThisMonth +=1;}//Hvis skudår
      var payment_date = new Date(date.getYear(),date.getMonth(),DaysInThisMonth);//Sidste dag i indeværende måned
          payment_date.setDate(payment_date.getDate() + parseFloat(arr[1]));
    alert(payment_date);
    alert(arr[1]);
    }
}
</script>

Den beregner datoen ud fra en given dato, plus en streng som bestemmer hvorledes den beregnet dato skal være. Eks:
Dato: 01-01-2005
Streng: LM10D (Løbende måned 10 dage)
Resultat: 10-02-2005

Problemet er at jeg får nogen underlige resultater i FF, og i IE, får jeg ganske simpelt bare en NaN.

Jeg er klar over at det måske ikke er verdens mest gennemskuelige kode, men hvis det er så spørg endelig.

Håber nogen kan hjælpe lidt her

Pft.
Avatar billede nielle Nybegynder
06. september 2005 - 19:28 #1
Sådan her:

<script type="text/javascript">
var date = '01-01-2005';
var payment_term = 'LM 10 D';

function calculate_paymentdate(date, payment_term)
{
    var monthdays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);  //Dage i måneder
    var arr = payment_term.split(" ");  //Splitter betalingsbetingelsesstreng

    var curr_date = date.split("-");  //Splitter givne dato
    var year = curr_date[2];  //Givne år
    var month = curr_date[1]-1;  //Givne måned
    var day = curr_date[0];  //Givne dag

    if (arr[0] == 'LM')
    {
        //Hvis 'Løbende måned'
        var date = new Date(year, month, day);  //Givet dato, formatteret JS style
        DaysInThisMonth = monthdays[month];  //Dage i givne måned

        if (month == 1)
        {
            if (year%400==0 || (year%4 == 0 && year%100!=0))
                DaysInThisMonth++;  // Hvis skudår
        }
           
        var payment_date = new Date(date.getYear(), date.getMonth(), DaysInThisMonth);  //Sidste dag i indeværende måned
        payment_date.setDate(payment_date.getDate() + parseInt(arr[1]));

        alert(payment_date);
        alert(arr[1]);
    }
}

calculate_paymentdate(date, payment_term)
</script>
Avatar billede nielle Nybegynder
06. september 2005 - 19:28 #2
Dit problem var at du med din:

var arr = payment_term.split(/(\d+)/g);//Splitter

- smider din værdi på 10 væk.
Avatar billede mickiii Nybegynder
06. september 2005 - 19:49 #3
Nielle - Ej den fungere nu fint nok, det er derfor 'g' er der, det skulle gerne fange delimiteren
Avatar billede nielle Nybegynder
06. september 2005 - 20:12 #4
Nej. Prøv at køre denne bid kode:

var payment_term = 'LM10D';
var arr = payment_term.split(/(\d+)/g);//Splitter betalingsbetingelsesstreng
alert(arr[0] + " " + arr[1]);

- og se så at dit 10-tal er væk.

Funktionen splitter din streng der hvor du har tal – tallene selv kommer ikke med i det endelige resultat.

'g' står i øvrigt for 'global' og det har intet at gøre med delimeteren. Lige i dette tilfælde er den endda overflødig.
Avatar billede nielle Nybegynder
06. september 2005 - 20:31 #5
En alternativ mulighed er denne her - hvor at du ikke behøver at indføre mellemrum i din variabel payment_term:

<script type="text/javascript">
var date = '01-01-2005';
var payment_term = 'LM10D';

function calculate_paymentdate(date, payment_term)
{
    var monthdays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);  //Dage i måneder

    var re = new RegExp("^([^0-9]+)([0-9]+)([^0-9]+)$", "g");
    re.exec(payment_term);  //Splitter betalingsbetingelsesstreng

    var arr = new Array(3)
    arr[0] = RegExp.$1;
    arr[1] = RegExp.$2;
    arr[2] = RegExp.$3;

    var curr_date = date.split("-");  //Splitter givne dato
    var year = curr_date[2];  //Givne år
    var month = curr_date[1]-1;  //Givne måned
    var day = curr_date[0];  //Givne dag

    if (arr[0] == 'LM')
    {
        //Hvis 'Løbende måned'
        var date = new Date(year, month, day);  //Givet dato, formatteret JS style
        DaysInThisMonth = monthdays[month];  //Dage i givne måned

        if (month == 1)
        {
            if (year%400==0 || (year%4 == 0 && year%100!=0))
                DaysInThisMonth++;  // Hvis skudår
        }
           
        var payment_date = new Date(date.getYear(), date.getMonth(), DaysInThisMonth);  //Sidste dag i indeværende måned
        payment_date.setDate(payment_date.getDate() + parseInt(arr[1]));

        alert(payment_date);
        alert(arr[1]);
    }
}

calculate_paymentdate(date, payment_term)
</script>
Avatar billede mickiii Nybegynder
06. september 2005 - 20:36 #6
Nielle: Undskyld du har ret, jeg havde bare overbevist mig selv om at det var 'g' der gjorde forskellen, men det viser sig at jeg derefter benyttede FF til at teste, da dets JS console er noget mere informativ:

Imidlertid så har jeg lavet lidt om i funktionen, og umiddelbart fungere den nu perfekt i FF, men i IE får jeg fortsat en 'NaN' - Kan du forklare hvorfor?

    <script language="javascript">
    var date = '01-01-2005';
    var payment_term = 'LM10D';
function calculate_paymentdate(date, payment_term) {
    var monthdays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);//Dage i måneder
    var arr = payment_term.split(/(\d+)/);//Splitter betalingsbetingelsesstreng i f.eks. LM & D
    var days = payment_term.match(/(\d+)/);//Fanger antallet af dage i betalingsstreng
    var curr_date = date.split("-");//Splitter givne dato
    var year = parseInt(curr_date[2]);//Givne år
    var month = parseInt(curr_date[1]-1);//Givne måned
    var day = parseInt(curr_date[0]);//Givne dag
    var date = new Date(year,month,day);//Givet dato, formatteret JS style
    if(arr[0] == 'LM') {//Hvis 'Løbende måned'
      daysthismonth = monthdays[month];//Dage i givne måned
      if (month == 1) { if (year%400==0 || (year%4 == 0 && year%100!=0) ) daysthismonth +=1;}//Hvis skudår
      var payment_date = new Date(year,month,daysthismonth + parseInt(arr[1]));//Sidste dag i indeværende måned
    } else if (arr[0] == 'NET') {
      var payment_date = new Date(year,month,day + parseInt(days[0]));
    }
  alert(payment_date);
}
</script>
Avatar billede mickiii Nybegynder
06. september 2005 - 20:36 #7
Hov, glemte at sige, at FF netop fanger delimiteren, så derfor havde jeg overbevist mig selv om at det var 'g' der gjorde forskellen.
Avatar billede nielle Nybegynder
06. september 2005 - 20:47 #8
Sådan her:

<script type="text/javascript">
var date = '01-01-2005';
var payment_term = 'LM10D';

function calculate_paymentdate(date, payment_term)
{
    var monthdays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);  //Dage i måneder

    var arr = payment_term.split(/(\d+)/);  //Splitter betalingsbetingelsesstreng i f.eks. LM & D
    var days = payment_term.match(/(\d+)/);  //Fanger antallet af dage i betalingsstreng

    var curr_date = date.split("-");  //Splitter givne dato
    var year = parseInt(curr_date[2]);  //Givne år
    var month = parseInt(curr_date[1]-1);  //Givne måned
    var day = parseInt(curr_date[0]);  //Givne dag

    var date = new Date(year, month, day);  //Givet dato, formatteret JS style

    if (arr[0] == 'LM')
    {
        //Hvis 'Løbende måned'
        daysthismonth = monthdays[month];  //Dage i givne måned

        if (month == 1)
        {
            if (year%400==0 || (year%4 == 0 && year%100!=0))
                daysthismonth++;  //Hvis skudår
        }

        var payment_date = new Date(year, month, daysthismonth); //Sidste dag i indeværende måned
        payment_date.setDate(payment_date.getDate() + parseInt(days[0]));
    }
    else if (arr[0] == 'NET')
    {
        var payment_date = new Date(year, month, day + parseInt(days[0]));
    }

    alert(payment_date);
}

calculate_paymentdate(date, payment_term)
</script>
Avatar billede nielle Nybegynder
06. september 2005 - 20:48 #9
Hvis FF fanger delimeteren, så er det faktisk en fejl i den måde FF håndtere JavaScript og regulære udtryk. :^|
Avatar billede mickiii Nybegynder
06. september 2005 - 20:51 #10
Jamen jeg bukker og skraber - Nu kan jeg komme lidt videre, så mange tak & smid et svar!
Avatar billede nielle Nybegynder
06. september 2005 - 20:53 #11
Svar :^)
Avatar billede mickiii Nybegynder
06. september 2005 - 20:54 #12
fuldt fortjent, og så lærte jeg også lidt :)
Avatar billede nielle Nybegynder
06. september 2005 - 21:00 #13
Mange tak for point :^)
Avatar billede nielle Nybegynder
06. september 2005 - 21:06 #14
Det kan i øvrigt godt simplifiseres lidt:

<script type="text/javascript">
var date = '01-01-2005';
var payment_term = 'LM10D';

function calculate_paymentdate(date, payment_term)
{
    var monthdays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);  //Dage i måneder

    var arr = payment_term.match(/([^\d]+)(\d+)([^\d]+)/);  //Fanger delene som nr. 1, 2 og 3 i arr

    var curr_date = date.split("-");  //Splitter givne dato
    var year = curr_date[2];  //Givne år
    var month = curr_date[1]-1;  //Givne måned
    var day = curr_date[0];  //Givne dag

    var date = new Date(year, month, day);  //Givet dato, formatteret JS style

    if (arr[1] == 'LM')
    {
        //Hvis 'Løbende måned'
        daysthismonth = monthdays[month];  //Dage i givne måned

        if (month == 1)
        {
            if (year%400==0 || (year%4 == 0 && year%100!=0))
                daysthismonth++;  //Hvis skudår
        }

        var payment_date = new Date(year, month, daysthismonth); //Sidste dag i indeværende måned
        payment_date.setDate(payment_date.getDate() + parseInt(arr[2]));
    }
    else if (arr[1] == 'NET')
    {
        var payment_date = new Date(year, month, day + parseInt(arr[2]));
    }

    alert(payment_date);
}

calculate_paymentdate(date, payment_term)
</script>
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