06. august 2009 - 09:28Der 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)"> <input type="text" name="cpr-status" size="25" value="<-- 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?
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
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);
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.
Synes godt om
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);
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:
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.
Synes godt om
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.
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);
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.