Skip to content

Instantly share code, notes, and snippets.

@Svish
Last active December 8, 2021 09:09
Show Gist options
  • Save Svish/3f7507fad63523210a0a9ee7e30097e9 to your computer and use it in GitHub Desktop.
Save Svish/3f7507fad63523210a0a9ee7e30097e9 to your computer and use it in GitHub Desktop.
Funksjon som sjekker om noe er et gyldig fødselsnummer
import { isValidFodselsnummer } from '.';
describe(isValidFodselsnummer.name, () => {
valid.forEach((fnr) => {
it(`"${fnr}" er et gyldig fødselsnummer`, () => {
expect(isValidFodselsnummer(fnr)).toBe(true);
});
});
invalid.forEach((fnr) => {
it(`"${fnr}" er IKKE et gyldig fødselsnummer`, () => {
expect(isValidFodselsnummer(fnr)).toBe(false);
});
});
});
const invalid = ['', '12345678910', '11111111111', 'kake', null, undefined];
// NOTE: Hentet fra http://www.fnrinfo.no/Verktoy/FinnLovlige_Tilfeldig.aspx
const valid = [
'01010750160',
'25017522550',
'21094641974',
'05018543356',
'07110768987',
'28101643982',
'29109545927',
'18020454659',
'15015716786',
'13017800951',
'05022423926',
'25060292771',
'21101744571',
'08096426357',
'09018931726',
'20095428984',
'05116513007',
'22038228289',
'20121917875',
'10115121648',
'17047108128',
'27050844833',
'22050333411',
'24067646378',
'06109235367',
'24051318621',
'24040783306',
'24116427083',
'28129747244',
'11047847720',
'29070763336',
'29095848581',
'17127120692',
'25027722159',
'08013842249',
'24086101579',
'02098918674',
'12096641808',
];
const MOD11 = 11;
const KONTROLLSIFFER_1 = 9;
const KONTROLLSIFFER_2 = 10;
const VEKTTALL_KONTROLLSIFFER_1 = [3, 7, 6, 1, 8, 9, 4, 5, 2];
const VEKTTALL_KONTROLLSIFFER_2 = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
const vekttallSum = (tall: number[], vekttall: number[]): number =>
vekttall.reduce((sum, factor, index) => sum + tall[index] * factor, 0);
/**
* Sjekker om verdien er et gyldig fødselsnummer.
*
* @see https://no.wikipedia.org/wiki/F%C3%B8dselsnummer
*/
export function isValidFodselsnummer(subject: string | null | undefined): boolean {
if (subject == null || subject.length !== 11) return false;
const tall = subject.split('').map(Number);
let kontrollsiffer1 =
MOD11 - (vekttallSum(tall, VEKTTALL_KONTROLLSIFFER_1) % MOD11);
if (kontrollsiffer1 === MOD11) {
kontrollsiffer1 = 0;
}
let kontrollsiffer2 =
MOD11 - (vekttallSum(tall, VEKTTALL_KONTROLLSIFFER_2) % MOD11);
if (kontrollsiffer2 === MOD11) {
kontrollsiffer2 = 0;
}
return (
kontrollsiffer1 === tall[KONTROLLSIFFER_1] &&
kontrollsiffer2 === tall[KONTROLLSIFFER_2]
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment