25. oktober 2007 - 13:38Der er
47 kommentarer og 1 løsning
Cpr validator
Jeg har lavet følgende script men den fejler i Line 9
Er der nogen der kan finde ud af hvad der er galt ?
<% Function CPROK(Streng) Dim Nummer, Sum Nummer = Trim(Replace(Streng, "-", "")) If Len(Nummer) <> 10 Or Not IsNumeric(CStr(Nummer)) Then Exit Function Check = Array(4, 3, 2, 7, 6, 5, 4, 3, 2, 1) Sum = 0 For i = 0 To 9 Sum = Sum + CInt(Mid(Nummer, i, 1)) * Check(i) Next If Sum Mod 11 = 0 Then CPROK = True End Function
If CPROK("250342-1247") Then Response.Write "Gyldigt CPR"
If CInt(Mid(Nummer, 9, 1)) Mod 2 = 0 Then Response.Write "... og du er en <span style=""color: red"">kvinde</span>" Else Response.Write "... og du er en <span style=""color: blue"">mand</span>" End If
Du kan ALDRIG kræve at en person skal oplyse fuldt person nummer (de sidste 4 cifre). Det er vist kun banker og kommunen/staten der må det (mener ikke engang politiet har krav på det)
Hvis jeg nu f.eks godt kunne tænke mig at den skal Fra dagsdato kunne Udregne alle de gyldige cpr-numre som der kunne laves idag, hvordan skal den så se ud ?
Jeg ved godt at den er lidt anderledes, Men er det for besværligt ? Kunne godt tænke mig den ændring nemlig, Hvis du selfølgelig vil hjelpe mig ?
Jamen efter din rådgivning ser min kode således ud
<% Function CPROK(Streng) Dim Nummer, Sum Nummer = Trim(Replace(Streng, "-", "")) If Len(Nummer) <> 10 Or Not IsNumeric(CStr(Nummer)) Then Exit Function Check = Array(4, 3, 2, 7, 6, 5, 4, 3, 2, 1) Sum = 0 For i = 0 To 9 Sum = Sum + CInt(Mid(Nummer, i, 1)) * Check(i-1) Next If Sum Mod 11 = 0 Then CPROK = True End Function
If CPROK("250342-1247") Then Response.Write "Gyldigt CPR"
If CInt(Mid(Nummer, 10, 1)) Mod 2 = 0 Then Response.Write "... og du er en <span style=""color: red"">kvinde</span>" Else Response.Write "... og du er en <span style=""color: blue"">mand</span>" End If
<% Function CPROK(Streng) Dim Nummer, Sum Nummer = Trim(Replace(Streng, "-", "")) If Len(Nummer) <> 10 Or Not IsNumeric(CStr(Nummer)) Then Exit Function Check = Array(4, 3, 2, 7, 6, 5, 4, 3, 2, 1) Sum = 0 For i = 1 To 10 Sum = Sum + CInt(Mid(Nummer, i, 1)) * Check(i-1) Next If Sum Mod 11 = 0 Then CPROK = True End Function
If CPROK("250342-1247") Then Response.Write "Gyldigt CPR"
If CInt(Mid(Nummer, 10, 1)) Mod 2 = 0 Then Response.Write "... og du er en <span style=""color: red"">kvinde</span>" Else Response.Write "... og du er en <span style=""color: blue"">mand</span>" End If
Og du er sikker på at det CPR-nr du kontrollerer er gyldigt? ;-)
Desuden skal du sørge for at returnere et veldefineret resultat fra din funktion, inden du afslutter den. Der er mindst 2 veje igennem din funktion som ikke returnerer noget. Det kan godt være VBScript tillader dette, men der er andre sprog hvor dette ikke er tilladt, så tillæg dig nogle gode vaner fra starten :-)
Du kan f.eks. starte med at sætte CPROK = false, inden du begynder at manipulere parameteren Streng.
Jeg ved godt alt det her lyder meget forvirret, men jeg er blevet kastet ind i det her og har kun haft det i 3 ½ dag. alt dette er nyt for mig. Var der en mulighed for du kunne hjælpe mig lidt. f.eks hvis du selv kunne tjekke det ?
Ja, det er fordi Nummer ikke er defineret i det scope hvor du refererer til den. Prøv lige denne version af kode i stedet (det hele skal udskiftes):
<% Function CPROK(Streng) Dim Nummer, Sum, Check, i
CPROK = false Nummer = Trim(Replace(Streng, "-", ""))
If Len(Nummer) <> 10 Or Not IsNumeric(Nummer) Then Exit Function
Check = Array(4, 3, 2, 7, 6, 5, 4, 3, 2, 1)
Sum = 0 For i = 1 To 10 Sum = Sum + CInt(Mid(Nummer, i, 1)) * Check(i-1) Next
If Sum Mod 11 = 0 Then CPROK = True End Function
cprnr = "250342-1247"
If CPROK(cprnr) Then Response.Write "Gyldigt CPR"
If CInt(Mid(cprnr, 10, 1)) Mod 2 = 0 Then Response.Write "... og du er en <span style=""color: red"">kvinde</span>" Else Response.Write "... og du er en <span style=""color: blue"">mand</span>" End If
Det fungere nu. Det var cpr-numret den var galt med. og jeg kan se ud fra beregningen at den er helt gal :P Den siger jeg er en kvinde... Men det er nu en lettere sag at ordne. Men for at vende tilbage til mit andet spørgsmål med Hvis jeg ønsker at udskrive alle de gyldige cpr-numre for pågældende dag ? var det noget du ville hjælpe mig med ?
Ja, det med kvinde/mand, det er givetvis fordi det næstsidste tal i dit CPRnr er et lige tal. Da cprnr indeholder en bindestreg er det jo det 11. tegn du skal kontrollere og ikke det 10.
Mht. til genereringen af cprnumre, så har jeg ikke lige tid til at sætte mig ind i hvordan det skal beregnes, så hvis du selv kan flikke et forslag sammen, hvor reglerne fremgår, så kan jeg muligvis hjælpe dig med at gøre den færdig (det er jo din opgave, ikke sandt? ;-)).
Det er jeg også ret sikker på jeg skal. Syntes bare det er meget svært, da jeg ikke har haft noget erffaring med det og så bliver kastet ud i sådan en opgave :)
Jamen det var så lidt, Det er dig jeg skal takke for den gode Tålmodighed, med dumme spørgsmål.
Ingen spørsgmål er dumme (første gang de bliver stillet :-)).
En simpel løsning (men ikke nødvendigvis den mest effektive) var at kalde din egen funktion CPROK med hver af det 9000 kombinationer af dags dato og de fire cifre og så bare udskrive dem der er valide. Men jeg er sikker på at det ikke er det der er menigen med opgaven, så det går nok ikke med mindre du også leverer den "rigtige" løsning... :-)
Response.Write("Valide CPR-numre:<br>") idag = "251007" for i = 1000 to 9999 checkcprnr = idag & "-" & i if cprok(checkcprnr) then Response.Write(checkcprnr & "<br>) end if next
Response.Write("Valide CPR-numre:<br>") idag = "251007" for i = 0 to 9999 checkcprnr = idag & "-" & right("0000" & i, 4) if cprok(checkcprnr) then Response.Write(checkcprnr & "<br>) end if next
Og som linket i første kommentar siger, så kan vi vel egentlig bare slette
if cprok(checkcprnr) then
og gøre 251007-0000 til 251007-9999 til lovlige cpr-numre. Ja, ok, det er en skoleopgave, men så må du fortælle dine lærere, at den netop er blevet for gammel ;)
Muligvis, men den med at lave CPR validering ser man stadig gang på gang uanset at folk faktisk har været advaret af CPR registeret selv i en del år efterhånden.
Lærene har derfor et job med at gøre deres egne studerende klar over det...
Jeg fik delvist lavet min opgave færdig og den kom til at se helt anderledes ud end dette resultat. jeg kan lige sende det til jer når jeg kommer på min bærbar. den er slet ikke færdig med den er accepteret :-)
Nielle>> Læren er godt klar over det. Det var bare en opgave vi skulle lave for at vise vi kunne skrive sproget. Ikke fordi det skulle være brugbart i den forstand bagefter.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.