FAQ |
Kalender |
2012-09-27, 22:02 | #1 | ||
|
|||
Mycket flitig postare
|
Hej,
Jag undrade ifall någon där ute har c# .net script för att kontrollera ifall ett personnummer är rätt eller felaktig... hör av dig ifall du är ville att dela med dig av scriptet. |
||
Svara med citat |
2012-09-27, 22:40 | #2 | ||
|
|||
Medlem
|
Testa detta Regex:
Kod:
\d{6}-\d{4} |
||
Svara med citat |
2012-09-27, 23:09 | #3 | |||
|
||||
Mycket flitig postare
|
Citat:
Till rätt person kan jag även lägga till att den ska ta fram telefonnummber (har koden redo för detta). Olika prioriteringar (mobilnummer, hem, jobb osv) och en mängd variabler som spelar roll. Får inte alltid fram telefonnummer (eller rätt telenummer), men bra att använda om man vill verifiera automatiskt att användaren telefonnummer är korrekt. Har detta till C# och PHP Hör av dig om du är intresserad av det. Senast redigerad av yakuzaemme den 2012-09-27 klockan 23:11 |
|||
Svara med citat |
2012-09-27, 23:37 | #4 | ||
|
|||
Klarade millennium-buggen
|
Citat:
|
||
Svara med citat |
2012-09-28, 00:26 | #5 | |||
|
||||
Mycket flitig postare
|
Citat:
Hurvida detta är acceptabelt eller ej enligt de tjänsterna jag kör emot är jag inte lika insatt i, om någon är intresserad så är det eran uppgift att ta reda på om detta är tillåtet eller inte |
|||
Svara med citat |
2012-10-04, 21:18 | #6 | |||
|
||||
Mycket flitig postare
|
Söker man efter "personnummer programmering" på Google hittar man en tråd på sweclockers av alla ställen som innehåller exempel i både PHP och C#. Vet dock inte hur bra den koden funkar i verkligheten men när jag kikade såg det lovande ut. Man får testa lite om man vill vara säker men det borde iaf funka mycket bättre än naiva regex-lösningar som bara kontrollerar formatet och inte giltigheten.
|
|||
Svara med citat |
2012-10-04, 23:30 | #7 | ||
|
|||
Klarade millennium-buggen
|
Luhn-algoritmen eller moduls 10-metoden (som används för beräkning av checksiffran i bland annat personnummer) finns beskriven på Wikipedia för den som är intresserad: http://sv.wikipedia.org/wiki/Luhn-algoritmen.
|
||
Svara med citat |
2012-10-04, 23:48 | #8 | ||
|
|||
Klarade millennium-buggen
|
Pseudocode:
Kod:
begin function getChecksiffra(text siffror) returns text integer summa = 0 for (integer index = siffror.length to 0 step -1) integer siffervärde = value(siffror[index]) // varannan gångras med 2 och varannan med 1... siffervärde = siffervärde * (((index+1) mod 2) +1) if (siffervärde>9) summa += siffervärde-9 summa += siffervärde mod 10 else summa += siffervärde endif end for text checksiffra = chr(10 - (summa mod 10)) return checksiffra // som text end function text nr = "811218987" text personnummer = nr + getChecksiffra(nr) print "Personnummer: " + String.Format("999999-9999",personnummer)) // Personnummer: 811218-9876 Senast redigerad av Conny Westh den 2012-10-05 klockan 00:00 |
||
Svara med citat |
2012-10-05, 00:20 | #9 | ||
|
|||
Klarade millennium-buggen
|
ska man vara riktigt petig så metoden funkar oavsett längd på indatat så ska den se ut så här:
Pseudocode: Kod:
begin function getChecksiffra(text siffror) returns text integer summa = 0 integer paritet = siffror.length mod 2 for (integer index = siffror.length to 0 step -1) integer siffervärde = value(siffror[index]) // varannan gångras med 2 och varannan med 1... siffervärde = siffervärde * (((index+paritet) mod 2) +1) if (siffervärde>9) summa += siffervärde-9 summa += siffervärde mod 10 else summa += siffervärde endif end for text checksiffra = chr(10 - (summa mod 10)) return checksiffra // som text end function text nr = "811218987" text personnummer = nr + getChecksiffra(nr) print "Personnummer: " + String.Format("999999-9999",personnummer)) // Personnummer: 811218-9876 |
||
Svara med citat |
2012-10-21, 09:04 | #10 | ||
|
|||
Klarade millennium-buggen
|
Realiserade pseudokoden i C# och fixade några buggar samt renodlade strukturen något.
Här är tre filer för C# med kontroll av checksiffran enligt modulus-10-metoden. Jag har medvetet inte lagt in kontroller av datum i personnummer, det gör att klassen även kan användas för orgnr, GD-nummer m.m. Men vill man ha det så är det lätt att lägga till ytterligare kontroller i isValidate-metoden så slår det igenom direkt. Jag har valt att göra klassen enkel så den kan anpassas till specifika behov snarare än att den blir för sträng för vissa användningsområden. Finns det önskemål så kan jag lägga till mer kontroller, för det är enkelt i den struktur som finns nu. Jag la upp en separat testklass: PersonnummerTest.cs så blir det enkelt att kontrollera om klassen gör vad den ska göra, testa med ditt eget personnummer så får du se.... Filen Program.cs är där hela programmet startar i C#. Klassen Personummer.cs är byggd generellt så den kan användas oavsett om du kör Console, Winform eller Webform, eller någon annan typ av användargränssnitt, all gränssnittskod ligger i klassen PersonnummerTest.cs. Håll till godo och slit den med hälsan.... :-) Kod:
//////////////////////////////////////////////////// // File........: Personnummer.cs // Author......: Conny Westh, Vallentuna, Sweden // EMail.......: [email protected] // Date Created: 2012-10-21 // Licence.....: Copyright as follows: // You may use this code at your own risk, // This code is provided as is! //////////////////////////////////////////////////// // Klassen kan användas för att skapa eller // kontrollera checksiffra i personnummer // Checksiffran beräknas med moudulus-10-metoden. // För att se hur klassen kan användas finns // exempel i filen PersonnummerTest.cs //////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Personnummer { public class Personnummer { private string PersNr; public Personnummer() { } public Personnummer(string PersNr) { if (isValidate(PersNr)) { this.PersNr = PersNr; } else { throw new ArgumentException(String.Format("Felaktigt personnummer: {0}.",PersNr)); } } public Boolean isValidate(string PersNr) { Boolean ret=false; string pnr9digits = String.Format("{0}{1}",PersNr.Substring(0,6),PersNr.Substring(7,3)); if (PersNr.Substring(10, 1).Equals(calculateCheckDigit(pnr9digits))) { ret = true; } return ret; } public string calculateCheckDigit(string strDigits) { //text nr = "811218987" //text personnummer = nr + calculateCheckDigit(nr) //print "Personnummer: " + String.Format("999999-9999",personnummer)) // Personnummer: 811218-9876 List<int> digits = new List<int>(); foreach (char c in strDigits.ToArray()) { digits.Add(int.Parse(String.Format("{0}",c))); } return String.Format("{0}", calculateCheckDigit(digits)); } public int calculateCheckDigit(List<int> digits) { int digitSum = 0; int checkDigit = 0; int paritet = digits.Count % 2; for (int index = digits.Count-1; index >= 0; index--) { int digitValue = digits[index]; // varannan multipliceras med 2 och varannan med 1... digitValue = digitValue * (((index + paritet) % 2) + 1); if (digitValue>9) { digitSum += digitValue / 10; digitSum += digitValue % 10; } else { digitSum += digitValue; } } checkDigit = (10 - (digitSum % 10)) % 10 ; return checkDigit; } public override string ToString() { return this.PersNr; } } } Kod:
//////////////////////////////////////////////////// // File........: PersonnummerTest.cs // Author......: Conny Westh, Vallentuna, Sweden // EMail.......: [email protected] // Date Created: 2012-10-21 // Licence.....: Copyright as follows: // You may use this code at your own risk, // This code is provided as is! //////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Personnummer { public class PersonnummerTest { public PersonnummerTest() { } public void Test() { Console.WriteLine(); Console.WriteLine("----- Test Suite for valid Personnummer -----"); List<Personnummer> pnrList = new List<Personnummer>(); List<string> pnrStringList = new List<string>(); try { Console.WriteLine(); Console.WriteLine("Add all valid Personnummer."); pnrStringList.Add("010101-0106"); pnrStringList.Add("020202-0202"); pnrStringList.Add("030303-0308"); pnrStringList.Add("101010-1010"); pnrStringList.Add("111111-1116"); pnrStringList.Add("121212-1212"); pnrStringList.Add("811218-9876"); pnrStringList.Add("010101+0106"); pnrStringList.Add("020202+0202"); pnrStringList.Add("030303+0308"); pnrStringList.Add("101010+1010"); pnrStringList.Add("111111+1116"); pnrStringList.Add("121212+1212"); pnrStringList.Add("811218+9876"); } catch (Exception ex) { Console.WriteLine("Personnr pnrStringList: FEL: {0}.", ex.Message); } try { Console.WriteLine(); Console.WriteLine("Test all Personnummer."); foreach (string pnr in pnrStringList) { try { pnrList.Add(new Personnummer(pnr)); //Console.WriteLine("Personnr: {0}.", pnr); } catch (ArgumentException ex) { Console.WriteLine("Personnr pnrList.Add: {0} FEL: {1}.", pnr, ex.Message); } catch (Exception ex) { Console.WriteLine("Personnr pnrList.Add: {0} FEL: {1}.", pnr, ex.Message); } } } catch (Exception ex) { Console.WriteLine("Personnr: pnrList FEL: {0}.", ex.Message); } Console.WriteLine(); Console.WriteLine("List all valid Personnummer."); foreach (Personnummer pnr in pnrList) { Console.WriteLine("Personnr: {0}.", pnr); } } } } Kod:
//////////////////////////////////////////////////// // File........: Program.cs // Author......: Conny Westh, Vallentuna, Sweden // EMail.......: [email protected] // Date Created: 2012-10-21 // Licence.....: Copyright as follows: // You may use this code at your own risk, // This code is provided as is! //////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Personnummer { public class Program { static void Main(string[] args) { PersonnummerTest pnrTest = new PersonnummerTest(); pnrTest.Test(); Console.ReadKey(); } } } |
||
Svara med citat |
Svara |
|
|