Gå til innhold

[Løst] Validering av fødselsnummer?


Anbefalte innlegg

Dette fant jeg ut at jeg ville også. Drit i hjemmeeksamen og Cell-prosessorer, dette var mer interessant i dag :p

 

 

static uint8_t weights[2][10] = {
 {3, 7, 6, 1, 8, 9, 4, 5, 2, 0},
 {5, 4, 3, 2, 7, 6, 5, 4, 3, 2}
};
int correctLength(long number) {
 return (01010000000 < number) && (number < 71529999999);
}
int checkNumber(long number) {
 if(!correctLength(number)) {
   return 0;
 }
 long n1 = number / 100;
 int n[9], mod = 10, div = 1;
 int i;
 for(i = 8; i >= 0; i--) {
   n[i] = (n1 % mod) / div;
   mod *= 10;
   div *= 10;
 }
 uint8_t last = 0, k[2];
 memset(k, 0, sizeof(uint8_t)*2);
 int j;
 for(i = 0; i < 2; i++) {
   for(j = 0; j < 9; j++) {
  k[i] += weights[i][j] * n[j];
   }
   k[i] += weights[i][9]*last;
   k[i] = 11 - (k[i] % 11);
   if(k[i] == 11) {
  k[i] = 0;
   }
   last = k[i];
 }
 long n2 = n1*100 + k[0]*10 + k[1];
 printf("%011ld\n", n2);
 return n2 == number;
}

Dette kan sikkert gjøres enklere, men dette var quick and dirty :)

 

 

 

Dette er hele oppgaven jeg har fått utlevert. Og ikke får å få en rask fasit, men hvis jeg skulle løse dette gjennom regex, hvordan skulle jeg ha skrevet dette fra start til stop?

Med regex er det mulig å sjekke lengde og få ut tallene. Tror jeg heller ville validert et char array, da det er enklere å få ut hvert siffer.

 

tall =~ "m/^\d{10,11}$/"

sjekker om lenden er rett hvis tall er en string. Men det er nok andre som er bedre i regexp en det jeg er.

Lenke til kommentar
Videoannonse
Annonse

Antar du mener at "correctLength()" er en "quick-and-dirty" måte og sjekke om fødselsnummeret er innenfor min. og maks. av hva normalt fødselsnummer/D-nummer/H-nummer kan være, men disse grensene er slik:

 

Vanlig fødselsnr.: 01010000000 <= x <= 31129999999

D-nummer: 41010000000 <= x <= 71129999999

H-nummer: 01410000000 <= x <= 31529999999

Endret av jonny
Lenke til kommentar

Takk for alt av svar, men har endelig funnet en løsning og fullført oppgaven

 

import javax.swing.JOptionPane;
public class f_nr {
public static void main(String[] args) {

 while(true) {
  validateBirthNumber();
 }
}

public static void validateBirthNumber() {

 String birthNumber = JOptionPane.showInputDialog("Skriv inn ditt Fødselsnummer : ");
 if(birthNumber == null) {
  System.exit(0); //force them exits
 }

 if (checkBirthNumber(birthNumber)) {
  JOptionPane.showMessageDialog(null, " Ditt fødselsnummer er gyldig!");
  System.exit(0); //force them exits
 } else {
  JOptionPane.showMessageDialog(null, " Ditt fødselsnummer er ugyldig!");
 }
}
public static boolean checkBirthNumber(String birthNumber) {
 try {
  // dag
  int d1 = Integer.parseInt(new String("" + birthNumber.charAt(0)));
  int d2 = Integer.parseInt(new String("" + birthNumber.charAt(1)));
  // Måned
  int m1 = Integer.parseInt(new String("" + birthNumber.charAt(2)));
  int m2 = Integer.parseInt(new String("" + birthNumber.charAt(3)));
  // År
  int y1 = Integer.parseInt(new String("" + birthNumber.charAt(4)));
  int y2 = Integer.parseInt(new String("" + birthNumber.charAt(5)));
  // Individ sifre
  int i1 = Integer.parseInt(new String("" + birthNumber.charAt(6)));
  int i2 = Integer.parseInt(new String("" + birthNumber.charAt(7)));
  int i3 = Integer.parseInt(new String("" + birthNumber.charAt(8)));
  int bk1 = Integer.parseInt(new String("" + birthNumber.charAt(9)));
  int bk2 = Integer.parseInt(new String("" + birthNumber.charAt(10)));
  int rest1, k1, rest2, k2;

  rest1 = ((3 * d1 + 7 * d2 + 6 * m1 + 1 * m2 + 8 * y1 + 9 * y2 + 4
 * i1 + 5 * i2 + 2 * i3) % 11);
  if (rest1 == 0) {
   k1 = 0;
  } else {
   k1 = 11 - rest1;
  }

  rest2 = ((5 * d1 + 4 * d2 + 3 * m1 + 2 * m2 + 7 * y1 + 6 * y2 + 5
 * i1 + 4 * i2 + 3 * i3 + 2 * k1) % 11);

  if (rest2 == 0) {
   k2 = 0;
  } else {
   k2 = 11 - rest2;
  }
  if (k1 == bk1 && k2 == bk2) {
   return true;
  } else {
   return false;
  }
 } catch (Exception nfe) {
  return false;
 }
}
}

Lenke til kommentar

Et alternativ til checkBirthNumber()-metoden:

 

private static String extractBirthNumber(String input) {
 if (input == null) return null;
 String result = input.replaceAll("[^0-9]", "");
 return (result.length() == 11 ? result : null);
}

private final static int[] weights1 = {3, 7, 6, 1, 8, 9, 4, 5, 2};
private final static int[] weights2 = {5, 4, 3, 2, 7, 6, 5, 4, 3, 2};

private static int calculateCheckDigit(String bno, int[] weights) {
 int sum = 0;
 for (int i = 0; i < weights.length; i++) {
   sum += weights[i] * (bno.charAt(i) - '0');
 }
 int result = 11 - sum % 11;
 return (result == 11 ? 0 : result);
}

public static boolean checkBirthNumber(String bno) {
 bno = extractBirthNumber(bno);
 return (bno == null ? false :
   calculateCheckDigit(bno, weights1) == (bno.charAt(9) - '0') &&
   calculateCheckDigit(bno, weights2) == (bno.charAt(10) - '0'));
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...