---
title: "Personnummer check"
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/68660-personnummer-check"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "JohannesC"
published: "2003-02-18T17:25:21.000Z"
updated: "2008-03-28T11:10:40.000Z"
replies: 19
views: 2292
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/asp/68660-personnummer-check"
---

# Personnummer check

## #1 — JohannesC, 2003-02-18T17:25Z

Hur kan jag kolla om folk skriver i ett korrekt personnummer (dvs. alla 10 siffror) i formuläret och att det inte är ett fejkat?
kan jag checka det på nåt sätt?
(att det inte är fejkat = alla 10 siffror står med + att det ska vara realistiskt...)

hur gör jag?

tack på förhand!

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

## #2 — Addeladde, 2003-02-18T17:30Z

Den här koden kontrollerar personnumret:

```
'Kolla om personummret är rätt
  IF persnr = "" THEN
    errorForm "ange ett personnummer.", backpage
  ELSE
  IF Len(persnr) <> 10 THEN
    errorForm "Felaktigt angivet personnummer Ange personnummret utan bindestreck totalt 10 siffror.", backpage
  ELSE
  persnr2 = persnr

  For i = 0 to 8

  k = Left(persnr2,1)
  persnr2 = Right(persnr2,len(persnr2)-1)

  k = k * ((i + 1) Mod 2 + 1 )
  IF len(k) = 2 THEN
  totalt = totalt + Int(Left(k,1)) + Int(Right(k,1))
  ELSE
  totalt = totalt + k
  END IF

  NEXT

  IF Int(Right(totalt,1)) <> 0 THEN
    sista = 10 - Int(Right(totalt,1))
  ELSE
    sista = 0
  END IF

  IF Cint(sista) = Cint(Right(persnr,1)) THEN
   persnr = persnr
  ELSE
   errorForm "Felaktigt personummer.", backpage
  END IF
  END IF
  END IF
```

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

## #3 — JohannesC, 2003-02-18T17:34Z

tackar... testar den =)

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

## #4 — Addeladde, 2003-02-18T17:37Z

Du får nog ändra raderna

errorform raderna får du ta bort eller göra om för att det ska fungera för dig.

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

## #5 — Vide, 2003-02-18T18:49Z

Varför inte använda regexp?

```
set objRegExp = new RegExp
objRegExp.Global = true
objRegExp.IgnoreCase = true
objRegExp.Pattern = "^\d{6}-?\d{4}$"
if objRegExp.test( strText ) then
  'Personnummret är korrekt
else
  'Personnummret är inkorrekt
end if
```

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

## #6 — Peeer, 2003-02-18T18:52Z

> **Vide skrev:**
>
> Varför inte använda regexp?
>
>
> ```
> set objRegExp = new RegExp
> objRegExp.Global = true
> objRegExp.IgnoreCase = true
> objRegExp.Pattern = "^\d{6}-?\d{4}$"
> if objRegExp.test( strText ) then
>   'Personnummret är korrekt
> else
>   'Personnummret är inkorrekt
> end if
> ```

Får man verkligen med kontrollen av kontrollsiffran i nummret då? Ovanstående kod kontrollerar väl bara att man skrivit 6siffror-4siffror?

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

## #7 — Vide, 2003-02-18T18:56Z

Är inte helt insatt hur det fungerar, vad gör kontrollsiffran? I vilket fall borde det gå att blanda in i regexp. :)

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

## #8 — Addeladde, 2003-02-18T19:01Z

Sista siffran är kontrollsifra och den räknas fram med de andra nio siffrorna i personnumret. Hur den gör det kan du ju se i min kod ovanför.

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

## #9 — Vide, 2003-02-18T19:38Z

Argh, nu fick du mig besatt att lära mig detta... skrev en funktion även fast du redan gjort en... ;)

Syntax: 

```
public function IsValidIdentity(strNumber) 'As Booelan
  dim strChar 'As String
  dim intSum 'As Integer
  dim intPartSum 'As Integer
  dim objRegExp 'as regexp
  dim i 'As Integer
  
  set objRegExp = new RegExp
  objRegExp.Global = true
  objRegExp.IgnoreCase = true
  objRegExp.Pattern = "^\d{6}-?\d{4}$"
  if objRegExp.test( strNumber ) then
    strNumber = replace( strNumber, "-", "" )
    for i = 1 to 9
      strChar = mid(strNumber, i, 1)
      intPartSum = cint(strChar) * ( ( i mod 2 ) + 1 )
      if len(cstr(intPartSum)) = 2 then
        intPartSum = cint(mid( intPartSum, 1, 1)) + cint(mid(intPartSum, 2, 1))
      end if
      intSum = intSum + intPartSum
    next
    IsValidIdentity = right(strNumber,1) = right(10 - right(intSum,1), 1)
  else
    IsValidIdentity = false
  end if
end function
```

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

## #10 — Addeladde, 2003-02-18T21:51Z

**Vide** Jag är imponerad och på 37 minuter också, hur fasiken gör du?  :bire 
Kan säga att personnummer kollen är ett av de slutarbeten man kan välja att göra i programmeringsteknik på KTH.

Jag ska t.o.m spara den någonstans på hårddisken eftersom den verkar vara lite smartare gjord.

Dock är den kod om jag postade testad på 100-tals personnummer. Så den ska nog vara buggfri

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

## #11 — Vide, 2003-02-18T22:15Z

> **Addeladde skrev:**
>
> **Vide** Jag är imponerad och på 37 minuter också, hur fasiken gör du?  :bire 
> Kan säga att personnummer kollen är ett av de slutarbeten man kan välja att göra i programmeringsteknik på KTH.

Man tackar! :D

Är det ett slutarbete också? Det gäller bara att veta vilka metoder/funktioner man har att tillgå i det språk man använder. Då kanske man skulle kunna gå programmeringsteknik då. ;)

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

## #12 — Addeladde, 2003-02-18T22:21Z

Det var ett av slutarbetena i programeringsteknik (java grundkurs 4 poäng)

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

## #13 — Erik Juhlin, 2003-02-18T22:38Z

Två najsiga funktioner för JScript:

```
function verifyOrgId(n)
{
	var re = new RegExp("^([0-9]{6})-([0-9]{4})$", "ig");
	var ma = re.exec(n);
	return (ma && (calculateCheckDigit(ma[1] + ma[2].substring(0,3)) == ma[2].charAt(3)));
}

function calculateCheckDigit(num)
{
	var i, n, sum = 0, l;
	
	num = num.toString();
	l = num.length;
	for(i = l - 1; i >= 0; i--)
	{
		n = parseInt(num.charAt(i)) * (2 - ((l + 3 - i) % 2));
		sum += parseInt(Math.floor(n / 10) + (n % 10));
	}
	return (10 - (sum % 10)) % 10;
}
```

verifyOrgId fungerar lika bra för personnummer. :)

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

## #14 — Erik Juhlin, 2003-02-18T22:42Z

JScripts syntax är så jäkla mycket snyggare och luftigare. Nästan så man skulle vilja gå över till det i ASP.
Men det blir väl C# som också verkar bra och har denna syntax. :)

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

## #15 — Engine^, 2003-02-19T00:47Z

> **Erik Juhlin skrev:**
>
> ```
> function verifyOrgId(n)
> {
> 	var re = new RegExp("^([0-9]{6})-([0-9]{4})$", "ig");
> 	var ma = re.exec(n);
> 	return (ma && (calculateCheckDigit(ma[1] + ma[2].substring(0,3)) == ma[2].charAt(3)));
> }
> ```

Avviker tråden här lite, men jag är lite nyfiken bara... får organistaionsnummer endast vara udda om... tappade tråden när *calculateCheckDigit(submatch\[0\] + 3 första i submatch\[1\])*?

/anm. C-syntax är vackert :)

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

## #16 — SugarDaddy, 2003-02-19T01:04Z

Vem vet?

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

## #17 — WebbisNet, 2004-05-24T16:24Z

Men hur skriver man om man bara vill kolla de 6 första, enbart för åldersuträkning

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

## #18 — whistler, 2008-03-27T00:00Z

Har någon en aning om hur man skriver om Vides funktion för att kunna hantera 12-siffriga personnummer? Jag har testat med att göra en  

```
StrNumber = Mid(StrNumber12, 3, Len(StrNumber12)-2)
```

men detta leder bara till att personnumret som man matade in i funktionen får fel värde när funktionen är avslutad (alltså, funktionen returnerar nytt värde på StrNumber och jag vill ju ha kvar mitt tolvsiffriga nummer)

Någon som har något förslag på hur man skall gå tillväga?

Tack på förhand

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

## #19 — Peter S, 2008-03-28T10:52Z

```
public function IsValidIdentity([red]byval[/red] strNumber)
```

Sedan kan du korta ned StrNumber inne i funktionen med den kod du postade.

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

## #20 — voigtann1, 2008-03-28T11:10Z

```
public function IsValidIdentity(strNumber) 'As Booelan
	dim strChar 'As String
	dim intSum 'As Integer
	dim intPartSum 'As Integer
	dim objRegExp 'as regexp
	dim i 'As Integer

	set objRegExp = new RegExp
	objRegExp.Global = true
	objRegExp.IgnoreCase = true
	objRegExp.Pattern = [b]"^(19|20)?(\d{6}-?\d{4})$"[/b]

	if objRegExp.test(strNumber) then
[b]
		Dim myMatches
		Set myMatches = objRegExp.Execute(strNumber)
		strNumber = myMatches(0).SubMatches(1)[/b]
		strNumber = replace(strNumber, "-", "")
		for i = 1 to 9
			strChar = mid(strNumber, i, 1)
			intPartSum = cint(strChar) * ( ( i mod 2 ) + 1 )
			if len(cstr(intPartSum)) = 2 then
				intPartSum = cint(mid( intPartSum, 1, 1)) + cint(mid(intPartSum, 2, 1))
			end if
			intSum = intSum + intPartSum
		next
		IsValidIdentity = right(strNumber,1) = right(10 - right(intSum,1), 1)
	else
		IsValidIdentity = false
	end if
end function
```

för att se 1900 och 2000-talet

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

---

Tråden på webben: https://www.webforum.nu/amne/asp/68660-personnummer-check
