webForumDet fria alternativet

Nordiska personnummer

JavaScript

1 svar · 1 608 visningar · startad av JAreMANNEN

Medlem sedan aug. 20002 272 inlägg
Frågan#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;
    }};
}
389 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
120 ms — deklarationer (db)
133 ms — hämta statistik (db)
134 ms — hämta tråd, inlägg och bilagor (db)
117 ms — ändringar (db)