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. <b>Jag har 2 frågor dock. 1a) Har du något förslag på lämpliga uttryck? :) <b>1a) Har du något förslag på lämpliga uttryck? :)</b> Vill du "tjuvkika" på en färdig kod så kan du kolla här: oj... det var en aning kortare än min :)Validering av personnumer...
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> 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> </td>
<td> <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 = ""
%>
Sv: Validering av personnumer...
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.Sv:Validering av personnumer...
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é...Sv: Validering av personnumer...
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>Sv: Validering av personnumer...
<%
' 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å...
Sv:Validering av personnumer...
Jag tackar för den och kommer att använda den för att lära mig!
Tack!