Följande skrev jag ihop för att validera danska, finska, norska och svenska personnummer efter kontrollsiffrorna som finns definierade.
Använd enligt följande:
var p = new pnr("[i]personnummer[/i]");
if (p.dk.valid())
if (p.fi.valid())
if (p.no.valid())
if (p.se.valid())
Alla tecken i de olika personnumren skall skrivas in efter varandra utan mellanslag. För Sverige kan det alltså se så här "5412240123"; för Finland "111352-308T". Båda exemplen är felaktiga dock.
function pnr(nr){
_this = this;
this.pnr = nr;
this.se = { valid: function(){
if (!/^\d{10}$/.test(_this.pnr))
return false;
var n = _this.pnr.split(''),
s = 0;
for (var i = 0, l = n.length - 1; i < l; ++i)
if (i % 2 == 0){
if (2 * n[i] > 9){
var t = Number(2 * n[i]).toString();
s += parseInt(t.charAt(0)) + parseInt(t.charAt(1));
}
else
s += 2 * n[i];
}
else
s += 1 * n[i];
if (Math.ceil(s / 10) * 10 - s != n[9])
return false;
return true;
}};
this.no = { valid: function(){
if (!/^\d{11}$/.test(_this.pnr))
return false;
var n = _this.pnr.split(''),
v1 = v2 = k1 = k2 = 0;
v1 = 3 * n[0] +
7 * n[1] +
6 * n[2] +
1 * n[3] +
8 * n[4] +
9 * n[5] +
4 * n[6] +
5 * n[7] +
2 * n[8];
if (v1 % 11 != 0)
k1 = 11 - (v1 % 11);
v2 = 5 * n[0] +
4 * n[1] +
3 * n[2] +
2 * n[3] +
7 * n[4] +
6 * n[5] +
5 * n[6] +
4 * n[7] +
3 * n[8] +
2 * k1;
if (v2 % 11 != 0)
k2 = 11 - (v2 % 11);
if (k1 != n[9] || k2 != n[10])
return false;
return true;
}};
this.fi = { valid: function(){
if (!/^\d{6}(-|\+|a)\d{3}[a-y0-9]$/i.test(_this.pnr))
return false;
var c = [0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','H','J','K','L','M','N','P','R','S','T','U','V','W','X','y'],
n = parseInt(_this.pnr.substring(0, 6) + _this.pnr.substring(7, 10));
if (c[n % 31] != _this.pnr.charAt(_this.pnr.length - 1).toUpperCase())
return false;
return true;
}};
this.dk = { valid: function(){
if (!/^\d{10}$/.test(_this.pnr))
return false;
var n = _this.pnr.split(''),
s = 4 * n[0] +
3 * n[1] +
2 * n[2] +
7 * n[3] +
6 * n[4] +
5 * n[5] +
4 * n[6] +
3 * n[7] +
2 * n[8];
if (11 - (s % 11) != n[9])
return false;
return true;
}};
}