Avatar billede rashid Praktikant
29. september 2008 - 11:14 Der er 17 kommentarer og
1 løsning

Validering af cpr

jeg ønsker et script, hvor man kan validere et cprnr. komme med en fejlmeddelelse hvis personen er over 60.
Avatar billede michael_stim Ekspert
29. september 2008 - 11:23 #1
Jeg er heldigvis ikke fyldt 60 år endnu ;o)
Avatar billede fennec Nybegynder
29. september 2008 - 11:24 #2
Du er klar over at Modus 11 funktionen ikke kan bruges 100% længere, da der findes cpr numre, som ikke overholder den længere:
http://cpr.dk/cpr/site.aspx?p=108&t=visartikel&Articleid=4347
Avatar billede michael_stim Ekspert
29. september 2008 - 11:25 #3
Avatar billede rashid Praktikant
29. september 2008 - 11:25 #4
det ved jeg, men det er også blot en løsning på kort sigt.
jeg har en funktion til cprvalidering, men mangler at koble den sammen med den:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Valider CPR nr</title>
<meta name="Generator" content="Stone's WebWriter 4">
<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"];
  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)-1,+cpr.substring(0,2));
    if(dag.getTime() > new Date().getTime() || !match){
      c.style.color = "red";
      c.value = "Ugyldigt Cpr nr.";
    }else{
      c.style.color = "green";
      c.value = "Gyldigt Cpr nr. (Køn: " + ((cpr.match(/[13579]$/))?"Mand":"Kvinde") + ")";
    }
  }else{
    c.disabled = true;
    c.style.color = "black";
    c.value = (cpr.length>0)?"Validerer ...":"<-- Indtast CPR nr.";
  }
}
</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>
</form>
</body>
</html>
Avatar billede roenving Novice
29. september 2008 - 15:37 #5
Lige til at få dig startet, du skal selvfølgelig også checke om datoen er forekommet tidligere i år !-)

...
    if(chk%11==0)match = true;

    var dag = new Date(+cpr.substring(4,2),+cpr.substring(2,2)-1,+cpr.substring(0,2));
    var nu = new Date();
    if(dag.getTime() > nu.getTime() || !match){
      c.style.color = "red";
      c.value = "Ugyldigt Cpr nr.";
    }else if(dag.getFullYear()+60<nu.getFullYear()){
      c.style.color = "red";
      c.value = "Personen er over 60 ,-(";
    }else{
      c.style.color = "green";
      c.value = "Gyldigt Cpr nr. (Køn: " + ((cpr.match(/[13579]$/))?"Mand":"Kvinde") + ")";
    }
  }else{
    c.disabled = true;
...
Avatar billede mcardle Nybegynder
29. september 2008 - 23:26 #6
Er det ikke bare at tage fødselsdagen og konvertere til et timestamp og minusse med current timestamp?

Lidt lige som roenving, men det kan gøres mere simpelt, hvis du ikke skal validere om det er en mand, kvinde og om numrene passer.

//mcardle
Avatar billede roenving Novice
30. september 2008 - 07:04 #7
-- da år ikke har den samme længde vil det kun give en overslagsmæssig korrekt åremål (omend der på 60 år er meget lille fejl !-) men man vil kunne udelukke en, der fylder 60 i morgen, og det bliver næppe nogen begejstret over !o]
Avatar billede rashid Praktikant
30. september 2008 - 11:47 #8
ok.. det er mig der ikke kan udtrykke mig klart:
jeg er blevet sat til at lave en formular, hvor følgende skal være valideret:

Ved indtastning af CPR-nr må kunden ikke være fyldt 60 år ved oprettelse, ellers skal der komme en advarsel med at "kunden har opnået efterlønsalderen, hvor der gælder særlige regler for oprettelse af pension til disse kunder".
i feltet "første indbetalingsdato" må man ikke kunne indtaste tidligere end dagsdato.
I feltet udbetalingsdato skal der valideres på følgende

For kapitalpensioner:
Udbetalingsdato skal være senere end opnået efterløn (efterløn kan slåes op i det vedhæftede excel ark)
Udbetalingsdato må ikke ligge senere end efterlønsalder + 10 år
Dato er altid den 1. i en måned

For ratepensioner:
Udbetalingsdato skal være senere end opnået efterløn
Udbetalingsdato må ikke ligge senere end efterlønsalder + 16 år
Udbetalingsdato skal ligge min. 5 år efter oprettelsesdato
Dato er altid den 1. i en måned

Er der en der kan hjælpe ? jeg kan desværre ikke tilbyde betaling, men selve løsningen vil blive lagt, så andre også kan få gavn af det.
Avatar billede rashid Praktikant
30. september 2008 - 11:47 #9
på forhånd tak..
Avatar billede roenving Novice
01. oktober 2008 - 06:22 #10
Hrm, måske lige en anelse for ambitiøst til et simpelt Eksperten-spørgsmål !-)
Avatar billede majbom Novice
01. oktober 2008 - 09:14 #11
er det ikke bare at splitte cpr-nummeret op i 3 dele; dag, måned og år og så lægge 1900 eller 2000 til året alt efter om det er over eller under det år vi har i år?

så burde det da være relativt nemt at udlede om personen er over eller under 60 præcis i dag? eller er jeg helt galt på den?
Avatar billede majbom Novice
01. oktober 2008 - 09:16 #12
jeg ved godt at det bliver et problem hvis vedkommende er 100 eller derover, men det er der vel ikke den store chance for?
Avatar billede rashid Praktikant
16. oktober 2008 - 22:40 #13
fandt selv ud af det :-)
tak for jeres bidrag.
Avatar billede majbom Novice
17. oktober 2008 - 08:13 #14
vil du dele løsningen med os andre?
det kunne være at der var andre der havde samme "problem"
Avatar billede olebole Juniormester
17. oktober 2008 - 09:16 #15
<ole>

- det er faktisk et krav i henhold til E's reglement  =)

/mvh
</bole>
Avatar billede rashid Praktikant
18. oktober 2008 - 00:30 #16
ok...
Da jeg ikke er så god til at programmere, så kiggede jeg lidt rundt på nettet. jeg fandt en løsning, der kan tage udagangspunkt i ens fødselsdato - skal man benytte cpr, så kan man blot skære resten fra i dette eksempel.

import java.util.*;
import java.io.*;

public class AgeCalculation{
  public static void main(String[] args) throws IOException{
    int day = 1, month = 0, year = 1, ageYears, ageMonths, ageDays;
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    Calendar cd = Calendar.getInstance();
    try{
      System.out.print("Enter year of your date of birth : ");
      year = Integer.parseInt(in.readLine());
      if(year > cd.get(Calendar.YEAR)){
        System.out.print("Invalid date of birth.");
        System.exit(0);
      }
      System.out.print("Enter month of your date of birth : ");
      month = Integer.parseInt(in.readLine());
      if(month < 1 || month > 12){
        System.out.print("Please enter monthe between 1 to 12.");
        System.exit(0);
      }
      else{
        month--;
        if(year == cd.get(Calendar.YEAR)){
          if(month > cd.get(Calendar.MONTH)){
            System.out.print("Invalid month!");
            System.exit(0);
          }
        }
      }
      System.out.print("Enter day of your date of birth : ");
      day = Integer.parseInt(in.readLine());
      if(month == 0 || month == 2 || month == 4 || month == 6 || month == 7 ||
month == 9 || month == 11){
        if(day > 31 || day < 1){
          System.out.print("Please enter day between 1 to 31.");
          System.exit(0);
        }
      }
      else if(month == 3 || month == 5 || month == 8 || month == 10){
        if(day > 30 || day < 1){
          System.out.print("Please enter day between 1 to 30.");
          System.exit(0);
        }
      }
      else{
        if(new GregorianCalendar().isLeapYear(year)){
          if(day < 1 || day > 29){
            System.out.print("Please enter day between 1 to 29.");
            System.exit(0);
          }
        }
        else if(day < 1 || day > 28){
          System.out.print("Please enter day between 1 to 28.");
          System.exit(0);
        }
      }
      if(year == cd.get(Calendar.YEAR)){
        if(month == cd.get(Calendar.MONTH)){
          if(day > cd.get(Calendar.DAY_OF_MONTH)){
            System.out.print("Invalid date!");
            System.exit(0);
          }
        }
      }
    }
    catch(NumberFormatException ne){
      System.out.print(ne.getMessage() + " is not a legal entry!");
      System.out.print("Please enter number.");
      System.exit(0);
    }
    Calendar bd = new GregorianCalendar(year, month, day);
    ageYears = cd.get(Calendar.YEAR) - bd.get(Calendar.YEAR);
    if(cd.before(new GregorianCalendar(cd.get(Calendar.YEAR), month, day))){
      ageYears--;
      ageMonths = (12 - (bd.get(Calendar.MONTH) + 1)) + (bd.get(Calendar.MONTH));
      if(day > cd.get(Calendar.DAY_OF_MONTH)){
        ageDays = day - cd.get(Calendar.DAY_OF_MONTH);
      }
      else if(day < cd.get(Calendar.DAY_OF_MONTH)){
        ageDays = cd.get(Calendar.DAY_OF_MONTH) - day;
      }
      else{
        ageDays = 0;
      }
    }
    else if(cd.after(new GregorianCalendar(cd.get(Calendar.YEAR), month, day))){
      ageMonths = (cd.get(Calendar.MONTH) - (bd.get(Calendar.MONTH)));
      if(day > cd.get(Calendar.DAY_OF_MONTH))
        ageDays = day - cd.get(Calendar.DAY_OF_MONTH) - day;
      else if(day < cd.get(Calendar.DAY_OF_MONTH)){
        ageDays = cd.get(Calendar.DAY_OF_MONTH) - day;
      }
      else
        ageDays = 0;
    }
    else{
      ageYears = cd.get(Calendar.YEAR) - bd.get(Calendar.YEAR);
      ageMonths = 0;
      ageDays = 0;
    }
    System.out.print("Age of the person : " + ageYears + " year, " + ageMonths +
" months and " + ageDays + " days.");
  }
}

hilsen
Rashid
Avatar billede majbom Novice
18. oktober 2008 - 08:07 #17
det er jo java det der, ikke javascript
Avatar billede olebole Juniormester
18. oktober 2008 - 10:34 #18
Java og JavaScript har i udgangspunktet kun fire ting til fælles: J, A, V og A  ;o)
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