Nordiska personnummer

JavaScript

1 svar · 1 629 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;
    }};
}
251 ms totalt · 4 externa anrop · v20260731065814-full.d34c6d5a
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)