---
title: "Nordiska personnummer"
type: "forum-thread"
url: "https://www.webforum.nu/amne/javascript/123531-nordiska-personnummer"
topic: "JavaScript"
topic_url: "https://www.webforum.nu/amne/javascript"
author: "JAreMANNEN"
published: "2005-03-01T17:35:53.000Z"
updated: "2005-03-02T16:11:15.000Z"
replies: 1
views: 1612
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/javascript/123531-nordiska-personnummer"
---

# Nordiska personnummer

## #1 — JAreMANNEN, 2005-03-01T17:35Z

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å...

Permalänk: https://www.webforum.nu/p/123531

## #2 — Peter S, 2005-03-02T16:11Z

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;
    }};
}
```

Permalänk: https://www.webforum.nu/p/1564728

---

Tråden på webben: https://www.webforum.nu/amne/javascript/123531-nordiska-personnummer
