Avatar billede tuidoi Nybegynder
30. april 2009 - 22:59 Der er 6 kommentarer og
1 løsning

CPR validering - efter den nye standard?

Hej

Jeg lavede engang en cpr validering efter modulus 11, men nu hvor jeg skal bruge noget lignende er denne ikke fyldestgørende mere.

Hvilken kontrol skal man foretage? Jeg kan kun finde data om den gamle: http://da.wikipedia.org/wiki/CPR-nummer

Er der nogen der kan finde data om den nye eller evt. en kodeblok i hvilken som helst kode. bare den opfylder den nyeste standard for cpr numre. Så kan jeg selv skrive den om til java.


På forhånd tak for hjælpen!
Avatar billede arne_v Ekspert
30. april 2009 - 23:04 #1
Der er ikke noget modulus check i det "nye" system.

Du kan kun checke dato etc..
Avatar billede tuidoi Nybegynder
30. april 2009 - 23:19 #2
Hvordan fungerer det så?

Er det så kun det offentlige selv, der kan tjekke dets gyldighed ved at slå op i deres database?

Findes der nogle tal på hvor mange cpr numre der ca. er oprettet, som ikke opfylder modulus 11 checket til dags dato?
Avatar billede arne_v Ekspert
30. april 2009 - 23:30 #3
Intet modolus check.

Ja det vil jeg tro.

Formentligt ikke ret mange. Problemet er kun opstaaet fordi CPR har givet en masse personer som er kommet til Danmark uden at kende deres praecise foedselsdag et CPR nummer som starter med 0101.
Avatar billede tuidoi Nybegynder
30. april 2009 - 23:41 #4
Tak for hjælpen.

Kender du et link til en god implementering af modulus 11?
Så er jeg fri for at starte fra scratch igen.

-Lig et svar samtidig.
Avatar billede tuidoi Nybegynder
30. april 2009 - 23:41 #5
ps. husk også at ligge svar her:
http://www.eksperten.dk/spm/867199

:)
Avatar billede arne_v Ekspert
01. maj 2009 - 02:04 #6
import java.util.*;

public class CPR {
  // format of danish CPR number:
  //  ddmmyy-nnnc
  // where:
  //  dd  = day
  //  mm  = month
  //  yy  = year
  //  nnn = sequence (includes century)
  //  c  = checksum (includes sex)
  private String number;

  // constructor
  public CPR(String number) {
      this.number = number;
  }

  // check validity
  public boolean isValid() {
      int[] ix = { 0, 1, 2, 3, 4, 5, 7, 8, 9, 10 };
      int[] c = { 4, 3, 2, 7, 6, 5, 4, 3, 2, 1 };
      if (number.length() != 11) {
        return false;
      }
      if (number.charAt(6) != '-') {
        return false;
      }
      for (int i = 0; i < 10; i++) {
        if (!Character.isDigit(number.charAt(ix[i]))) {
            return false;
        }
      }
      if (dd() > 31) {
        return false;
      }
      if (mm() > 12) {
        return false;
      }
      if (century() == 0) {
        return false;
      }
      int temp = 0;
      for (int i = 0; i < 10; i++) {
        temp = temp + c[i] * numericValue(number.charAt(ix[i]));
      }
      return ((temp % 11) == 0);
  }
  // check make/female
  public boolean isMale() {
      return odd(numericValue(number.charAt(10)));
  }
  public boolean isFemale() {
      return even(numericValue(number.charAt(10)));
  }
  // get date of birth
  public Date getBirth() {
      int year = yy() + century();
      int mon = mm() - 1;
      int mday = dd();
      GregorianCalendar temp = new GregorianCalendar();
      temp.set(year, mon, mday);
      return temp.getTime();
  }
  // get age
  public int getAge() {
      Calendar now = GregorianCalendar.getInstance();
      Calendar born = new GregorianCalendar();
      born.setTime(getBirth());
      int result;
      result = now.get(Calendar.YEAR) - born.get(Calendar.YEAR);
      if (now.get(Calendar.DAY_OF_YEAR) < born.get(Calendar.DAY_OF_YEAR)) {
        result--;
      }
      return result;
  }

    // standard methods
    public int hashCode() {
        return number.hashCode();
    }
    public boolean equals(Object o) {
        if(o instanceof CPR) {
            return number.equals(((CPR)o).number);
        } else {
            return false;
        }
    }
  // get parts
  private int dd() {
      return Integer.parseInt(number.substring(0, 2));
  }
  private int mm() {
      return Integer.parseInt(number.substring(2, 4));
  }
  private int yy() {
      return Integer.parseInt(number.substring(4, 6));
  }
  // calculate century
  private int century() {
      switch (numericValue(number.charAt(7))) {
        case 0 :
        case 1 :
        case 2 :
        case 3 :
            return 1900;
        case 4 :
        case 9 :
            if (yy() < 37)
              return 2000;
            else
              return 1900;
        case 5 :
        case 6 :
        case 7 :
        case 8 :
            if (yy() < 37)
              return 2000;
            else if (yy() > 57)
              return 1800;
            else
              return 0;
        default :
            return 0;
      }
  }
  // odd/even
  private static boolean odd(int v) {
      return ((v & 1) == 1);
  }
  private static boolean even(int v) {
      return ((v & 1) == 0);
  }
  // numeric value of char
  private static int numericValue(char c) {
      return (c - '0');
  }
}
Avatar billede arne_v Ekspert
01. maj 2009 - 02:04 #7
og svar
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
Kurser inden for grundlæggende programmering

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