hjahre Skrevet 4. oktober 2012 Del Skrevet 4. oktober 2012 Dette fant jeg ut at jeg ville også. Drit i hjemmeeksamen og Cell-prosessorer, dette var mer interessant i dag 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
jonny Skrevet 4. oktober 2012 Del Skrevet 4. oktober 2012 (endret) 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 4. oktober 2012 av jonny Lenke til kommentar
hjahre Skrevet 4. oktober 2012 Del Skrevet 4. oktober 2012 Som du sikkert ser, så er det også den eneste valideringa jeg gjør hvis man ser bort fra kontrollsiffera. Jeg blåser en lang mars i all validering av gyldige datoer Lenke til kommentar
KiX Skrevet 9. oktober 2012 Forfatter Del Skrevet 9. oktober 2012 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
jonny Skrevet 9. oktober 2012 Del Skrevet 9. oktober 2012 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå