Avatar billede sunlock Nybegynder
09. marts 2011 - 13:57 Der er 5 kommentarer og
1 løsning

Udregn alder fra CPR

Hej kloge hoveder,

Er det overhovedet muligt at udregne en alder ud fra et cpr. Se f.eks. følgende:
a: 190281-xxxx
b: 190209-xxxx

Man kan med fordel antage at a er 30 år, men hvor gammel er b? 1 eller 101?

Jeg har lavet en stump kode, som udregner alderen, men den funker ikke helt efter planen, da den jo bruger år som 81 og 09 (og ikke 1981 og 1909/2009):
-----
private String calculateAge(String s) {
    try {
        int y = Integer.parseInt(s.substring(4, 6));
        int m = Integer.parseInt(s.substring(2, 4)) - 1;
        int d = Integer.parseInt(s.substring(0, 2));
        int century = 0;
        char lbNr = s.charAt(6);
        switch (lbNr) {
        case '0':
        case '1':
        case '2':
        case '3':
            century = 1900;
            break;
        case '4':
        case '9':
            century = y < 37 ? 2000 : 1900;
            break;
        default: // 5, 6, 7, 8
            century = y < 37 ? 2000 : y > 57 ? 1800 : 0;
        }
        y += century;
        Calendar cal = new GregorianCalendar(y, m, d);
        Calendar now = new GregorianCalendar();
        int res = now.get(Calendar.YEAR) - cal.get(Calendar.YEAR);
        if ((cal.get(Calendar.MONTH) > now.get(Calendar.MONTH)) || (cal.get(Calendar.MONTH) == now.get(Calendar.MONTH) && cal.get(Calendar.DAY_OF_MONTH) > now.get(Calendar.DAY_OF_MONTH))) {
            res--;
        }
        return String.valueOf(res);
    } catch (Exception e) {
        log.info("Error calculating age for cpr: " + s);
        return "";
    }
}
-----
Avatar billede richardjensen Seniormester
09. marts 2011 - 14:17 #1
I 'EXEL' kan det gøres ret enkelt.
Avatar billede erikjacobsen Ekspert
09. marts 2011 - 14:41 #2
I PDF-filen nederst på http://www.cpr.dk/cpr/site.aspx?p=108&t=visartikel&Articleid=4225 kan du se reglen for om året er 1909 eller 2009. Det afhænger af hvad der står i xxxx - de 4 sidste cifre i personnummeret.
Avatar billede arne_v Ekspert
09. marts 2011 - 14:54 #3
Noget meget gammel kode:

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
09. marts 2011 - 14:55 #4
mod 11 checket boer slettes, da det ikke er validt laengere
Avatar billede sunlock Nybegynder
10. marts 2011 - 07:55 #5
Tak arne_v, koden virker. Og tak til erikjakobsen for linket - det er altid dejligt med lidt baggrund for den kode man har :)

richardjensen, nu var der jo en grund til at jeg havde valgt at poste den i Java-gruppen *hint hint*
Avatar billede arne_v Ekspert
10. marts 2011 - 23:44 #6
så smider jeg et 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