Avatar billede hcthorsen Praktikant
06. august 2009 - 09:28 Der er 5 kommentarer og
1 løsning

Beregn alder fra CPR - igen igen igen

Dette spørgsmål er set før, men jeg har ikke kunnet de tidligere svar til noget. Jeg er JS ignorant, hvilket mit spørgsmål vil bære præg af. Jeg har sakset følgende kode (i lidt anden form) et eller andet sted på Eksperten, og det virker fint:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Valider CPR nr</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript" type="text/javascript">
function cprCheck(flt){
  var cpr = flt.value,match = false,c = flt.form.elements["cpr-status"];a = flt.form.elements["alder"];
  if(cpr.match(/[0-9]{6}\-?[0-9]{4}/)){
    c.disabled = false;
    cpr = cpr.replace(/\-/g,"");
    var chk = 0;
    for(i=9;i>-1;i--){
      chk += (+cpr.charAt(i))*((i>2)?(10-i):(4-i));
    }
    if(chk%11==0)match = true;
    var dag = new Date(+cpr.substring(4,2),+cpr.substring(2,2),+cpr.substring(0,2));
    if(dag.getTime() > new Date().getTime() || !match){
      c.style.color = "red";
      c.value = "Ugyldigt Cpr nr.";
      a.value = "**";
    }else{
      c.style.color = "green";
      c.value = "Gyldigt Cpr nr. (Køn: " + ((cpr.match(/[13579]$/))?"Mand":"Kvinde") + ")";
      showAge();
      a.value = alder;
    }
  }else{
    c.disabled = true;
    c.style.color = "black";
    c.value = (cpr.length>0)?"Validerer ...":"<-- Indtast CPR nr.";
  }
}

function showAge()
{
var str = document.forms[0].cpr.value;
var bday=parseInt(str.substring(0,2));
var bmo=(parseInt(str.substring(2,4))-1);
var byr=(str.substring(4,6));
if(byr>10)
{
byr = "19"+byr;
}
else
{
byr = "20"+byr;
}
var byr;
var age;
var now = new Date();
tday=now.getDate();
tmo=(now.getMonth());
tyr=(now.getFullYear());
{
if((tmo > bmo)||(tmo==bmo & tday>=bday))
age=byr
else
{age=parseInt(byr)+1}
alder=(parseInt(tyr)-parseInt(age))
}}
</script>
</head>
<body>
<form name="form1" method="post" onSubmit="">
<input type="text" name="cpr" onKeyUp="cprCheck(this)">&nbsp;
<input type="text" name="cpr-status" size="25" value="&lt;-- Indtast CPR nr." disabled><br>
Alder <input type="text" name="alder" size="5" value="Alder" disabled><br>

</form>
</body>
</html>


Jeg vil imidlertid gerne have det modificeret lidt.

1) Man laver jo åbenbart ikke Modulus11 tjek længere, så den kontrol skulle gerne pilles ud.

2) Alderen skal ikke beregnes i forhold til i dag, men i forhold til en dato man taster ind i et datofelt.

Er der nogen der kan lave denne lille modificering?
Avatar billede Slettet bruger
07. august 2009 - 00:51 #1
Gud hvor er javascriptet dårligt skrevet. Her er en version modificeret til dine behov, og med nogle rettede fejl:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Valider CPR nr</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript" type="text/javascript">
function showAge() {
    var str = document.forms[0].cpr.value;
    var bday = parseInt(str.substring(0,2));
    var bmo = parseInt(str.substring(2,4)) - 1;
    var byr = str.substring(4,6);
   
    if(byr > 15) {
        byr = "19"+byr;
    } else {
        byr = "20"+byr;
    }
   
    var byr = parseInt(byr);
   
    var byr;
    var age;
    tday = parseInt(document.forms[0].day.value);
    tmo = parseInt(document.forms[0].month.value) - 1;
    tyr = parseInt(document.forms[0].year.value);
   
    if((tmo > bmo) || (tmo == bmo & tday >= bday)) {
        age = byr;
    } else {
        age = byr + 1;
    }
   
    alder = tyr - age;
    document.forms[0].alder.value = alder;
}
</script>
</head>
<body>
<form name="form1" method="post">
CPR: <input type="text" name="cpr"><br>
Dag: <input type="text" name="day"><br>
Måned: <input type="text" name="month"><br>
År: <input type="text" name="year"><br>
Alder: <input type="text" name="alder" size="5" value="Alder" disabled><br>
<input type="button" value="Udregn alder" onClick="showAge()">
</form>
</body>
</html>
Avatar billede hcthorsen Praktikant
07. august 2009 - 09:20 #2
Det ser jo fint ud.

Jeg har ikke den store JS erfaring, så jeg vil ikke gøre mig klog på hvor godt det script jeg har brugt hidtil er skrevet.

Dit script udregner alderen fint som ønsket, men det indeholder ingen form for validering af CPR-nummeret. Kunne man ikke beholde en smule kontrol med at man ikke indtaster noget der er helt i skoven (ala 3213xx-xxxx), men udelader modulus 11? Så vidt jeg kan se kan dit script heller ikke skelne mellem om man er 3 år eller 103 år, eller er det mig der er glat på den?

Det er ikke sikkert jeg når at se dit svar før om 14 dage, da jeg tager på ferie i dag.
Avatar billede Slettet bruger
07. august 2009 - 12:31 #3
Ja, mit script virker kun for folk der er født mellem 1915 og 2014, men der er vist ikke mange mennesker på over 94 eller under -5 der er på internettet. CPR-nummeret er lavet sådan at man ikke får mere end to cifre af årstallet med, så det eneste jeg kan gøre er at rykke rundt på årstallene, som f.eks. 1905 til 2005 i stedet.

Nu validerer den også at årstallet er i formatet 123456-7890 eller 1234567890:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Valider CPR nr</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript" type="text/javascript">
function showAge() {
    var cpr = document.forms[0].cpr.value;
    if(cpr.match(/^[0-9]{6}\-?[0-9]{4}$/)) {
        cpr = cpr.replace(/\-/g,"");
       
        var bday = parseInt(cpr.substring(0,2));
        var bmo = parseInt(cpr.substring(2,4)) - 1;
        var byr = cpr.substring(4,6);
     
        if(byr > 15) {
            byr = "19"+byr;
        } else {
            byr = "20"+byr;
        }
     
        var byr = parseInt(byr);
        var age;
       
        tday = parseInt(document.forms[0].day.value);
        tmo = parseInt(document.forms[0].month.value) - 1;
        tyr = parseInt(document.forms[0].year.value);
     
        if((tmo > bmo) || (tmo == bmo & tday >= bday)) {
            age = byr;
        } else {
            age = byr + 1;
        }
     
        alder = tyr - age;
        document.forms[0].alder.value = alder;
    } else {
    document.forms[0].alder.value = "Ukorekt CPR-nummer";
    }
}
</script>
</head>
<body>
<form name="form1" method="post">
CPR: <input type="text" name="cpr"><br>
Dag: <input type="text" name="day"><br>
Måned: <input type="text" name="month"><br>
År: <input type="text" name="year"><br>
Alder: <input type="text" name="alder" value="Alder" disabled><br>
<input type="button" value="Udregn alder" onClick="showAge()">
</form>
</body>
</html>
Avatar billede hcthorsen Praktikant
24. august 2009 - 20:43 #4
Jeg har faktisk brug for at validere cpr-numre på folk over 94 år. Man får ganske rigtigt ikke mere end 2 cifre med af årstallet, men mig bekendt er det stadig sådan, at det første ciffer af de sidste 4 cifre indeholder information om årstallet:

0-3 => 1900-1999
4,9 => 1937-2036
5-8 => 1858-1899,2000-2036

Du skal have mange tak for ulejligheden. Scriptet skal rettes mere til før jeg kan bruge det, men jeg har ikke tid til at kigge på det nu. Smider du ikke et svar så du kan få point.
Avatar billede Slettet bruger
24. august 2009 - 23:03 #5
Jeg har aldrig hørt om det med det fjerde ciffer fra enden, men man kan sikkert sagtens udvikle en løsning der også udregner ud fra det.
Avatar billede asconsulting Nybegynder
28. juni 2012 - 11:29 #6
Scriptet er lavet så den overholder standard cpr komponenten, dog har jeg undladt modulus 11, da den ikke holder længere. Jeg beregner alder ud fra angiven dato.

function ShowAge()
{
    var cpr = document.forms[0].txtCprAmb.value;
    var dato = document.forms[0].dateAmbulantBesoegAmbulant.value;
   
    cpr = cpr.replace(/\-/g,"");
    dato = dato.replace(/\-/g,"");
   
    var bday = parseInt(cpr.substring(0,2));
    var bmo = parseInt(cpr.substring(2,4)) - 1;
    var byr = cpr.substring(4,6);
    var syvende = cpr.substring(6,7);
   
    if(dato != "")
    {
        if(syvende >= 0 && syvende <= 3)
        {
            byr = "19"+byr;
        }
        if(syvende == 4 || syvende == 9)
        {
            if(byr <= 36)
            {
                byr = "20"+byr;
            }
            else
            {
                byr = "19"+byr;
            }
        }
        if(syvende >= 5 && syvende <= 8)
        {
            if(byr <= 57)
            {
                byr = "20"+byr;
            }
            else
            {
                byr = "18"+byr;
            }
        }
        var byr = parseInt(byr);
        var age;
       
        if(dato != "")
        {
            var tday = parseInt(dato.substring(0,2));
            var tmo = parseInt(dato.substring(2,4)) - 1;
            var tyr = parseInt(dato.substring(4,8));
        }

        if((tmo > bmo) || (tmo == bmo & tday >= bday)) {
            age = byr;
        } else {
            age = byr + 1;
        }
     
        alder = tyr - age;
        if (alder < 0){
            alder = 0
        }   
        document.forms[0].intPtAlderAmbulant.value = alder;
    }   
}
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

IT-JOB