Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Validering av personnumer...

Postades av 2008-03-17 15:54:05 - Anders Hydén, i forum asp - allmänt, Tråden har 6 Kommentarer och lästs av 1353 personer

Jag är medveten om att det redan finns ett stadigt gäng funktioner för validering av personnummer, men jag ville göra en egen dels för att lära mig och dels för att ha full kontroll på funktionen.

Jag har 2 frågor dock.

1) Kan man göra det smidigare på något sätt? Utan att bli allt för invecklad?
2) Hur gör man för att den här scriptet ska köras automatiskt vid ex. onBlur?
Informationen hämtas ifrån en sida med ett formulär:

<body>
<form id="form1" name="form1" method="post" action="functions.asp">
  
  
  <table width="500" border="1" cellpadding="0" cellspacing="0" bordercolor="#000000">
    <tr>
      <td>&nbsp;Personnummer:</td>
      <td><input type="text" name="personnummer" id="personnummer" /></td>
    </tr>
    <tr>
      <td>Kön:</td>
      <td><p>
        <label>
          <input type="radio" name="gender" value="male" id="RadioGroup1_0" />
          Man</label>
        <br />
        <label>
          <input type="radio" name="gender" value="female" id="RadioGroup1_1" />
          Kvinna</label>
        <br />
      </p></td>
    </tr>

    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;<input type="submit" name="submit" id="submit" value="Submit" /></td>
    </tr>
  </table>
</form>
</body>


Och här är hela "funktionen":

<%
	Option Explicit

	Dim StrTempNumber
	Dim strPNumber
	Dim intGender
	Dim strGender
	Dim strGenderCheck
	Dim intNumber1, intNumber1_1, intNumber1_2, intNumber2, intNumber3, intNumber3_1, intNumber3_2, intNumber4, intNumber5, intNumber5_1, intNumber5_2, intNumber6, intNumber7, intNumber7_1, intNumber7_2, intNumber8, intNumber9, intNumber9_1, intNumber9_2
	Dim intGivenChecksum
	Dim intCompleteNumber
	Dim intCalculatedChecksum
	
	'Hämtar hela det inmatade nummret samt formaterar det.
	strTempNumber = request.form("personnummer")
	
	If InStr(strTempNumber, "-") Then
		strPNumber = replace(strTempNumber, "-","")
		strPNumber = right(strPNumber,10)
	Else
		strPNumber = right(strTempNumber,10)
	End If
	strTempNumber = ""
	
	'Plockar ut inmatat kön
	strGender = request.form("gender")
	
	'Plockar ut "köns-siffran".
	intGender = int(mid(strPNumber,9,1))

	'Om valt kön = man, så ska siffran vara ojämn.
	If strGender = "male" Then
		If intGender = 1 Or intGender = 3 Or intGender = 5 Or intGender = 7 Or intGender = 9 Then
			strGenderCheck = "Ok"
		Else
			strGenderCheck = "NotOk"
		End If
		
	'Om valt kön = kvinna, så ska siffran vara jämn.
	ElseIf strGender = "female" Then
		If intGender = 0 Or intGender = 2 Or intGender = 4 Or intGender = 6 Or intGender = 8 Then
			strGenderCheck = "Ok"
		Else
			strGenderCheck = "NotOk"
		End If
	End If

	'Plockar ut inmatad kontrollsiffra
	intGivenChecksum = CInt(mid(strPNumber,10,1))
	
	'Plocka ut nummren
	intNumber1 = CInt(mid(strPNumber,1,1)) * 2
		If Len(intNumber1) = "2" Then
			intNumber1_1 = 1
			intNumber1_2 = CInt(mid(intNumber1,2,1))
		Else
			intNumber1_1 = intNumber1
			intNumber1_2 = 0
		End If
	
	intNumber2 = CInt(mid(strPNumber,2,1))
	
	intNumber3 = CInt(mid(strPNumber,3,1)) * 2
		If Len(intNumber3) = "2" Then
			intNumber3_1 = 1
			intNumber3_2 = CInt(mid(intNumber3,2,1))
		Else
			intNumber3_1 = intNumber3
			intNumber3_2 = 0
		End If

	intNumber4 = CInt(mid(strPNumber,4,1))
	
	intNumber5 = CInt(mid(strPNumber,5,1)) * 2
		If Len(intNumber5) = "2" Then
			intNumber5_1 = 1
			intNumber5_2 = CInt(mid(intNumber5,2,1))
		Else
			intNumber5_1 = intNumber5
			intNumber5_2 = 0
		End If

	intNumber6 = CInt(mid(strPNumber,6,1))
	
	intNumber7 = CInt(mid(strPNumber,7,1)) * 2
		If Len(intNumber7) = "2" Then
			intNumber7_1 = 1
			intNumber7_2 = CInt(mid(intNumber7,2,1))
		Else
			intNumber7_1 = CInt(intNumber7)
			intNumber7_2 = 0
		End If

	intNumber8 = CInt(mid(strPNumber,8,1))
	
	intNumber9 = CInt(mid(strPNumber,9,1)) * 2
		If Len(intNumber9) = "2" Then
			intNumber9_1 = 1
			intNumber9_2 = CInt(mid(intNumber9,2,1))
		Else
			intNumber9_1 = intNumber9
			intNumber9_2 = 0
		End If

	
	intCompleteNumber = CInt(intNumber1_1 + intNumber1_2 + intNumber2 + intNumber3_1 + intNumber3_2 + intNumber4 + intNumber5_1 + intNumber5_2 + intNumber6 + intNumber7_1 + intNumber7_2 + intNumber8 + intNumber9_1 + intNumber9_2)
	intCalculatedChecksum = 10 - Mid(intCompleteNumber,2,1) 
	
	'Skriver ut klart...
	If strGenderCheck = "Ok" And intCalculatedChecksum = intGivenChecksum Then
		response.Write("Status: OK!")
	Else
		response.Write("Status: Ej OK.<br>Kön: " & strGenderCheck & "<br>Inmatad Kontrollsiffra: "& intGivenChecksum & "<br>Uträknad kontrollsiffra: " & intCalculatedChecksum)
	End If
	
	'Nollar objekt
	StrTempNumber = ""
	strPNumber = ""
	intGender = ""
	strGender = ""
	strGenderCheck = ""
	intNumber1 = ""
	intNumber1_1 = ""
	intNumber1_2 = ""
	intNumber2 = ""
	intNumber3 = ""
	intNumber3_1 = ""
	intNumber3_2 = ""
	intNumber4 = ""
	intNumber5 = ""
	intNumber5_1 = ""
	intNumber5_2 = ""
	intNumber6 = ""
	intNumber7 = ""
	intNumber7_1 = ""
	intNumber7_2 = ""
	intNumber8 = ""
	intNumber9 = ""
	intNumber9_1 = ""
	intNumber9_2 = ""
	intGivenChecksum = ""
	intCompleteNumber = ""
	intCalculatedChecksum = ""

%>


Svara

Sv: Validering av personnumer...

Postades av 2008-03-18 00:04:54 - Stefan Brännström

<b>Jag har 2 frågor dock.

1) Kan man göra det smidigare på något sätt? Utan att bli allt för invecklad?</b>
Ja... några saker som eventuellt kan göra det smidigare:
a. Validering av data kan göras enklare med reguljära uttryck
b. Om kön inte är man så måste det väl vara kvinna... eller? (Jämnt heltal(x): x MOD 2 = 0, Udda heltal(x): x MOD 2 = 1)
c. Om skriptet ändå skall ge ett felmeddelande om man valt fel kön, varför inte avbryta exekveringen redan där?
d. Beräkning av kontrollsiffra kan förenklas med en loop (t ex for-next)
e. Nollar objekt??? Varför då? (det du nollar i skriptet är variabler... behövs verkligen det?)

<b>2) Hur gör man för att den här scriptet ska köras automatiskt vid ex. onBlur?</b>
onBlur är en händelse på klientsidan. För att fånga det måste du använda dig av ett klientbaserat skriptspråk, t ex JavaScript.


Svara

Sv:Validering av personnumer...

Postades av 2008-03-18 00:18:38 - Anders Hydén

1a) Har du något förslag på lämpliga uttryck? :)
1b) Det har du helt rätt i!
1d) Hm... måste nog fundera lite på hur du menade där.. :)
1e) Ingen aning, verkade vara en bra idé...


Svara

Sv: Validering av personnumer...

Postades av 2008-03-18 00:26:22 - Stefan Brännström

<b>1a) Har du något förslag på lämpliga uttryck? :)</b>
Detta brukar jag använda för att validera att ett inmatat värde skulle kunna vara ett personnummer
<code>
^(\d{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])-(\d{4})$
</code>
Jag brukar även kolla både på klientsidan (JavaScript) innan formuläret postas, samt på serversidan (ASP) innan behandling av data sker.

<b>1d) Hm... måste nog fundera lite på hur du menade där.. :) </b>
Ungefär så här:
<code>
Loopa igenom personnumret, "siffra" för "siffra" (använd en for-sats)
Multiplicera varannan "siffra" med 2 (börja med första)
Slå ihop till en ny sträng
Slut loop
Loopa igenom den nya strängen, "siffra" för "siffra"
Lägg ihop varje siffra
Slut Loop
Gör en heltalsdivision (MOD) med 10, om resultatet är 0 så är personnumret korrekt, annars är det inte korrekt.
</code>


Svara

Sv: Validering av personnumer...

Postades av 2008-03-18 01:25:32 - Stefan Brännström

Vill du "tjuvkika" på en färdig kod så kan du kolla här:

<%
  '  Vi sätter ett personnummer, bara för att testa...
  Dim pnr
  pnr = "010203-1234"

  Set re = New RegExp
  re.Pattern = "^(\d{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])-(\d{4})$"
  If re.Test(pnr) Then
    pnr = Replace(pnr,"-","")
    Dim i,nyStr,sum
    nyStr = ""
    sum = 0
    For i = 1 To Len(pnr)
      If i MOD 2 = 1 Then
        nyStr = nyStr & cStr(cInt(Mid(pnr,i,1)) * 2)
      Else
        nyStr = nyStr & Mid(pnr,i,1)
      End If
    Next
    For i = 1 To Len(nyStr)
      sum = sum + cInt(Mid(nyStr,i,1))
    Next
    If sum MOD 10 = 0 Then
      Response.Write("Korrekt personnummer")
    Else
      Response.Write("Fel: Kontrollsiffran stämmer ej!")
    End If
  Else
      Response.Write("Fel: Personnumret är inte korrekt inskrivet!")
  End If
%>

...något kortare än ditt skript... ;)
Går att korta ner lite till... men jag låter det vara så här... kanske enklare att förstå...


Svara

Sv:Validering av personnumer...

Postades av 2008-03-19 01:24:09 - Anders Hydén

oj... det var en aning kortare än min :)
Jag tackar för den och kommer att använda den för att lära mig!
Tack!


Svara

Sv: Validering av personnumer...

Postades av 2008-03-19 07:52:10 - Stefan Brännström

Inga problem ;)


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 153
27 952
271 704
739
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies