webForumDet fria alternativet

Personnummer check

ASP

19 svar · 2 281 visningar · startad av JohannesC

Medlem sedan okt. 200211 inlägg
Frågan#1

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!

Medlem sedan jan. 20013 406 inlägg
#2

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
Medlem sedan okt. 200211 inlägg
#3

tackar... testar den =)

Medlem sedan jan. 20013 406 inlägg
#4

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.

Medlem sedan dec. 19998 577 inlägg
#5

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
Medlem sedan mars 20025 907 inlägg
#6

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?

Medlem sedan dec. 19998 577 inlägg
#7

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

Medlem sedan jan. 20013 406 inlägg
#8

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.

Medlem sedan dec. 19998 577 inlägg
#9

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
Medlem sedan jan. 20013 406 inlägg
#10

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

Medlem sedan dec. 19998 577 inlägg
#11

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

Medlem sedan jan. 20013 406 inlägg
#12

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

Medlem sedan maj 200010 687 inlägg
#13

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. :)

Medlem sedan maj 200010 687 inlägg
#14

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. :)

Medlem sedan dec. 20003 887 inlägg
#15

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 :)

Medlem sedan apr. 20021 155 inlägg
#16

Vem vet?

Medlem sedan feb. 20032 027 inlägg
#17

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

Medlem sedan okt. 200148 inlägg
#18

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

Medlem sedan dec. 20025 483 inlägg
#19
public function IsValidIdentity([red]byval[/red] strNumber)

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

Medlem sedan juni 20019 519 inlägg
#20
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

268 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)