Kom ihåg mig?
Home Menu

Menu


asp.net C# kontroll av personnummer.

 
Ämnesverktyg Visningsalternativ
Oläst 2012-10-21, 08:04 #1
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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();
		}
	}

}
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-10-21, 21:05 #2
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Citat:
Ursprungligen postat av ConnyWesth Visa inlägg
Kod...

Du gör det så mycket svårare och mer komplicerat än vad det är. Dessutom har dendär inget kontroll över falska personuppgifter, som man kan få tag på genom en enkel google-sökning. Med andra ord är en sådan kontroll värdelös om den ska användas mot riktiga användare.

Ska den bara användas inom exempelvis företaget för att registera sig, fine. Kan skriva ihop en liten kodsnutt senare ikväll och posta här, på en lösning jag tycker är bättre.
yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 18:49.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017