Nordiska personnummer

JavaScript

1 svar · 1 612 visningar · startad av JAreMANNEN

Medlem sedan aug. 20002 272 inlägg
Trådstart#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å...

Medlem 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;
    }};
}
259 ms totalt · 4 externa anrop · v20260731065814-full.d34c6d5a
117 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)