Permalänk

Kontrollera personnummer i C#

Hej!
Vill börja med att säga att jag har sökt och har kollat tidigare trådar angående liknande problem, men hittar ingen som är en lösning för min huvudverk.

Jag har en en uppgift i c# där man ska kontrollera om personnumret är giltigt och vilket kön.
Jag har fått allt att fungera utom just kontrollen av personnumret och vilket kön det tillhör vad jag än skriver så får jag ett meddelande i en textbox som säger att personnumret är ogiltigt, jag vet att det är groteskt mycket kommentarer men jag har varit tvungen att lägga till dessa så jag vet vad jag har felsökt.

jag delar med mig av huvud programmet här nedan:

Klicka för mer information

using System; namespace Uppgift3WindowsForm { public partial class Form1 : Form { // Skapa en personklass med egenskaper och metoder public class Person { // Egenskaper för förnamn, efternamn och personnummer public string Fornnamn { get; set; } public string Efternamn { get; set; } public string Personnummer { get; set; } // Metod för att kontrollera om personnumret är giltigt public bool IsValid() { // Kontrollera att personnumret har rätt längd och format if (Personnummer.Length != 13 || Personnummer[6] != '-') { return false; } // Ta bort bindestrecket och omvandla personnumret till en array av siffror string digits = Personnummer.Replace("-", ""); int[] numbers = new int[12]; for (int i = 0; i < 12; i++) { numbers[i] = int.Parse(digits[i].ToString()); } // Beräkna kontrolltalet enligt algoritmen int sum = 0; for (int i = 0; i < 12; i++) { // Multiplicera varje siffra med omväxlande 2 och 1 int product = numbers[i] * (2 - i % 2); // Addera siffersummorna för respektive produkt sum += product / 10 + product % 10; } // Kontrollera att kontrolltalet är jämnt delbart med 10 return sum % 10 == 0; } // Metod för att avgöra personens kön public string GetGender() { // Kontrollera att personnumret är giltigt if (!IsValid()) { return "Personnummeret är ogiltligt"; } // Ta ut näst sista siffran i personnumret int digit = int.Parse(Personnummer[11].ToString()); // Om siffran är jämn är personen en kvinna, annars en man if (digit % 2 == 0) { return "Kvinna"; } else { return "Man"; } } } // Skapa en instans av personklassen Person person = new Person(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void registeraPersonnummerToolStripMenuItem_Click(object sender, EventArgs e) { // Visa formuläret för inmatning av personuppgifter panel1.Visible = true; } private void AvslutaToolStripMenuItem_Click_1(object sender, EventArgs e) { // Stäng programmet Application.Exit(); } private void btnCheck_Click(object sender, EventArgs e) { // Hämta personuppgifterna från textfälten person.Fornnamn = txtFornamn.Text; person.Efternamn = txtEfternamn.Text; person.Personnummer = txtPersonnummer.Text; // Kontrollera om personnumret är giltigt bool valid = person.IsValid(); // Visa resultatet i en multiline textbox txtResultat.Text = $"Förnamn: {person.Fornnamn}\r\n"; txtResultat.Text += $"Efternamn: {person.Efternamn}\r\n"; txtResultat.Text += $"Personnummer: {person.Personnummer}\r\n"; txtResultat.Text += $"Giltigt: {valid}\r\n"; txtResultat.Text += $"Kön: {person.GetGender()}\r\n"; } private void txtResultat_TextChanged(object sender, EventArgs e) { } } }

Visa mer
Rubrik
Visa signatur

Varför gick nätverkskabeln till terapeuten? För att den kände sig utdragen och aldrig kopplad på rätt sätt!

Permalänk
Hedersmedlem

Koden i sig verkar korrekt, men på det jag hittat ska man inte använda århundrande-siffrorna för beräkning av kontrollsiffran, utan för t ex 19870123-456 beräknar man kontrollsiffran på 870123456. Har du testat att göra så?

GetGender tar sannolikt ut fel siffra också. Efter att IsValid har körts ger väl Personnummer[11] kontrollsiffran (den 12:e siffran, om bindestreck saknas).

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Hedersmedlem

@Thomas Personnummer har väl egentligen bara två siffror för årtal (den officiella metoden för att lösa krockar med personer över 100 år är att byta ’-’ till ’+’)?

Permalänk
Hedersmedlem

Ett tips är att räkna ut kontrollsiffran manuellt. Om den manuella uträkningen inte stämmer överens med den automatiska kanske du kan reda ut varför det bli så genom att skriva ut vad varje term i summan blir, och jämföra med den korrekta uträkningen?

Permalänk

Tack för tipsen, jag ska ta en koll imorgon och åter kommer

Visa signatur

Varför gick nätverkskabeln till terapeuten? För att den kände sig utdragen och aldrig kopplad på rätt sätt!

Permalänk
Medlem

Det är Luhn-algoritmen som ska användas, i alla fall om uppgiften handlar om svenska personnummer. Den används även till exempel på kreditkortsnummer och i alla fall en del OCR-nummer.

De flesta implementationerna utesluter kontrollsiffran från beräkningen och räknar ut kontrollsiffran.

Då kan man använda samma (rena) funktion för att både räkna fram en kontrollsiffra när man ska generera den och för att, som i ditt fall, validera en kontrollsiffra i indata genom att jämföra med sin egen uträkning.

Väljer man den gängse strategin så gissar jag att det blir enklare att jämföra med andra implementationer.