Personlig kontrollsiffra

Last updated 5 months ago

Luhn Patent Figur 1. Patent för mekanisk dator för beräkning av kontrollsiffra.

Personnummer, liksom många andra nummer t.ex. artikelnummer och plusgironummer, innehåller en kontrollsiffra som beräknats enligt Luhns algoritm. Du ska skriva en klass, PersonalIdentityNumber, som ska validera om ett personnummer är korrekt eller inte. Klassen ska även kunna avgöra om personnumret tillhör en kvinna eller man.

Personnummer består av åtta eller sex siffror följt av ett (eventuellt) bindestreck, eller plustecken, och fyra avslutande siffror. Korrekt formaterade personnummer är på formaten ÅÅMMDD-FFFK, där FFF är ett löpnummer och K är en kontrollsiffra (svenska myndigheter lagrar dock personnummer på formatet ÅÅÅÅMMDDFFFK).

Andra tillåtna format är ÅÅÅÅMMDD-FFFK, ÅÅMMDDFFFK och ÅÅMMDD+FFFK, som alla ska kunna valideras. Då formatet ÅÅMMDD-FFFK, eller ÅÅMMDDFFFK, används så tillhör personnumret en person som inte fyllt 100 år. Förekommer det ett +-tecken i personnumret, ÅÅMMDD+FFFK, betyder det att personen har fyllt 100 år.

Eftersom du ska låta klassen PersonalIdentityNumber ärva från klassen LuhnCheckDigit, som är given, behöver inte din klass ha något ”eget” fält för numret, eller metod för att validera numret. Det tillhandahåller basklassen, och du kan koncentrera dig helt och hållet på valideringen av formatet, datumdelen av personnumret och om personnumret tillhör en kvinna eller man.

Basklassen LuhnCheckDigit innehåller en rad medlemmar, och av störst intresse är egenskapen SantizedNumber och IsValid, som du har användning av vid implementation av klassen PersonalIdentityNumber.

PersonalIdentityNumber Figur 2. Klassdiagram över PersonalIdentityNumber som ärver från LuhnCheckDigit samt den uppräkningsbara typen Gender.

Klassen PersonalIdentityNumber

Fält

PersonalIdentityNumberRegex

Enklast att kontrollera om ett personnummer har rätt format är att använda ett reguljärt uttryck. Instansiera ett objekt av klassen Regex med det reguljära uttrycket @"^(\d{6}[-+]?|\d{8}-?)\d{4}$" och undersök därefter om personnumret har rätt format med hjälp av metoden IsMatch, som returnerar ett boolskt värde. Det är det statiska privata "read-only" fältet PersonalIdentityNumberRegex som ska referera till Regex-objektet med det reguljära uttrycket..

Egenskaper

Birthdate

En "read-only"-egenskap som ska returnera den del av personnumret som utgör födelsedatumet (ÅÅMMDD) i forma av ett DateTime-objekt.

Är inte personnumret giltigt ska ett undatag av typen InvalidOperationException kastas.

BirthNumber

En "read-only"-egenskap som ska returnera den del av personnumret som utgör födelsenumret (FFF) i forma av en sträng.

Är inte personnumret giltigt ska ett undatag av typen InvalidOperationException kastas.

CheckDigit

En "read-only"-egenskap som ska returnera den del av personnumret som utgör kontrollsiffran (K) i forma av ett heltal.

Är inte personnumret giltigt ska ett undatag av typen InvalidOperationException kastas.

Gender

Egenskapen Gender är av den uppräkningsbara typen Gender och ska returnera Gender.Female om personnumret tillhör en kvinna respektive Gender.Male om det är en man. Om den näst sista siffran i personnumret är jämn till hör personnumret en kvinna; är den udda en man. Anropas någon av egenskaperna för ett ogiltigt personnummer ska ett undantag kastas. Lämpligt undantag att kasta i detta fall är ett av typen InvalidOperationException som ska användas i de fall ”when a method call is invalid for the object's current state” som det står i dokumentationen.

IsValid

Egenskapen IsValid, som är publik och överskuggar (overrides) metoden med samma namn i basklassen, ska returnera true om formatet, datumet och kontrollsiffrans är korrekta; i övriga fall ska false returneras.

Konstruktor

Klassen PersonalIdentityNumber har en konstruktor med en parameter av typen string, med standardvärdet "", vars parameter du skickar vidare till basklassen. Basklassen behöver information om hur många siffror, räknade från höger, som ska användas då personnumret valideras (10 siffror används vid valideringen).

Metoder

ToString()

Metoden ToString i basklassen ska överskuggas (override) och ska alltid returnera en sträng med formatet ÅÅÅÅMMDD-FFFK oavsett vilket format som användes då personnumret matades in.

Är inte peronnumret giltigt är det lämpligt att du låter metoden returnera det oformaterade numret, d.v.s. det värde egenskapen Number har.

ToString(string format)

Metoden ska konvertera det aktuella PersonalIdentityNumber-objektet till en sträng genom att använda specificerat format.

Parameter formatet ska innehålla ett enda tecken som definierar formatet på den returnerade strängen. Om formatet är null eller en tom sträng ska formatet Y användas.

  • Y, "", null: ska ge en sträng på formatet YYYYMMDD-FFFK.

  • y: ska ge en sträng på formatet YYMMDD-FFFK eller YYMMDD+FFFK.

  • g: ska ge en sträng där det angivna personnumret är oformaterat (d.v.s. det värde egenskapen Numberhar).

Är inte peronnumret giltigt är det lämpligt att du låter metoden returnera det oformaterade numret, d.v.s. det värde som formatsträngen g returnerar.

Anges annan formatsträng än de ovan angivna ska ett undantag av typen FormatException kastas.

TryParseBirtdate(out DateTime result)

...

Mål

Efter att ha gjort uppgiften ska du:

  • Känna till hur du skapar en klass.

  • Kunna skriva en klass som ärver från en basklass.

  • Veta vad det innebär att överskugga en metod i en basklass.

  • Förstå och hantera konstruktorer, egenskaper och metoder.

  • Kunna använda reguljära uttryck för att verifiera att en sträng uppfyller ställda krav.

  • Veta hur du kastar undantag.

  • Kunna hantera uppräkningsbara typer (enum).

Tips

Läs om:

  • ...

Lösningsförslag