Skip to content

Instantly share code, notes, and snippets.

@laat
Last active August 29, 2015 14:05
Show Gist options
  • Select an option

  • Save laat/71dae7071b97c3da15b0 to your computer and use it in GitHub Desktop.

Select an option

Save laat/71dae7071b97c3da15b0 to your computer and use it in GitHub Desktop.
(function(exports){
exports.valider = function valider(fnr) {
if (typeof fnr !== 'string') {
throw 'fødselsnummer er ikke en streng';
}
if(fnr.split('').filter(function(d){
return !isNaN(parseInt(d, 10));
}).length !== 11){
return false; // er ikke 11 tall lang, fjernet NaN.
}
return parseInt(fnr[9], 10) === beregnKontrollsiffer1(fnr) &&
parseInt(fnr[10], 10) === beregnKontrollsiffer2(fnr);
};
function beregnKontrollsiffer(fodselsnummer, multiplikatorTabell){
var sum = 0;
for(var i = 0; i<multiplikatorTabell.length; i++){
sum += parseInt(fodselsnummer[i], 10) * multiplikatorTabell[i];
}
var rest = sum % 11;
if(rest === 0) return 0;
return 11-rest;
}
function beregnKontrollsiffer1(fodselsnummer) {
var kontrollSiffer1Multiplikatorer = [ 3, 7, 6, 1, 8, 9, 4, 5, 2 ];
return beregnKontrollsiffer(fodselsnummer, kontrollSiffer1Multiplikatorer);
}
function beregnKontrollsiffer2(fodselsnummer) {
var kontrollSiffer2Multiplikatorer = [ 5, 4, 3, 2, 7, 6, 5, 4, 3, 2 ];
return beregnKontrollsiffer(fodselsnummer, kontrollSiffer2Multiplikatorer);
}
exports.generer = function (dato) {
if (!(dato instanceof Date) || dato.getFullYear() < 1854) {
throw 'ugyldig dato argument';
}
var lopenr = 0;
if(dato.getFullYear() < 1900) {
lopenr = 500;
}else if(dato.getFullYear() < 2000) {
lopenr = 0;
}else if(dato.getFullYear() < 2040) {
lopenr = 500;
} else {
throw 'ugyldig dato argument';
}
var fnr = "";
while(fnr === "") {
var fnrStart = fodselsnummerFormatDato(dato) + format3d(lopenr++);
k1 = beregnKontrollsiffer1(fnrStart);
if(k1 === 10) continue;
fnrStart = fnrStart + k1.toString();
k2 = beregnKontrollsiffer2(fnrStart);
if(k2 === 10) continue;
fnr = fnrStart + k2.toString();
}
return fnr;
};
function fodselsnummerFormatDato(dato) { //ddMMyy
var dd = dato.getDate(),
mm = dato.getMonth(),
yy = dato.getFullYear() % 100;
if(dd<10) dd = '0'+dd;
if(mm<10) mm = '0'+mm;
if(yy<10) yy = '0'+yy;
return dd.toString()+mm.toString()+yy.toString();
}
function format3d(value) { // naïve String.format("%03d", value);
if(value < 10) return '00'+value;
if(value < 100) return '0'+value;
if(value < 1000) return value.toString();
throw 'too high value, should not happen';
}
})(typeof exports === 'undefined'? this.mod11={}: exports);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment