webForumDet fria alternativet

Nordiska personnummer

1 svar · 1 608 visningar · startad av JAreMANNEN

JAreMANNENMedlem sedan aug. 20002 272 inlägg
#1

Har ett formulär där jag bl.a validerar personnummer.
Problemet är bara att Svenska, finska och Norska personnummer skiljer sig emellan. Danska vet jag inget om.

Frågan är altså om någon här vet vart jag kan hitta något java script som validerar några utav dessa?
Valdiering för svenska har jag redan altså...

Peter SMedlem sedan dec. 20025 483 inlägg
#2

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;
    }};
}
140 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)