C# :: Aufgabe #74
4 Lösungen

IBAN Checksumme prüfen
Anfänger - C#
von pocki
- 26.11.2014 um 12:27 Uhr
Schreibe eine Funktion, welche einen IBAN als Zeichenfolge entgegen nimmt.
Bei diese Zeichenfolge soll überprüft werden, ob die Checksumme/Prüfsumme für eine gültige IBAN stimmt.
Die unterschiedliche Schreibweisen (mit und ohne Freiraum) sowie die unterschiedlichen Längen je nach Land sind ebenfalls zu berücksichtigen.
Beispiele der Schreibweisen:
DE19 1234 1234 1234 1234 12
DE19-1234-1234-1234-1234-12
DE19123412341234123412
AT19 1234 1234 1234 1234
CH19 1234 1234 1234 1234 1
Bei diese Zeichenfolge soll überprüft werden, ob die Checksumme/Prüfsumme für eine gültige IBAN stimmt.
Die unterschiedliche Schreibweisen (mit und ohne Freiraum) sowie die unterschiedlichen Längen je nach Land sind ebenfalls zu berücksichtigen.
Beispiele der Schreibweisen:
DE19 1234 1234 1234 1234 12
DE19-1234-1234-1234-1234-12
DE19123412341234123412
AT19 1234 1234 1234 1234
CH19 1234 1234 1234 1234 1
Lösungen:

using System; using System.Collections.Generic; using System.Text.RegularExpressions; namespace trainYourProgrammer { class MainClass { private static bool IBANvalid(string IBAN) { IBAN = IBAN.Replace (" ", "").Replace ("-", ""); Dictionary<string, int> countryLength = new Dictionary<string, int> (); countryLength.Add ("DE", 20); countryLength.Add ("AT", 18); countryLength.Add ("CH", 19); string country = IBAN.Substring (0, 2); int length; if (!countryLength.TryGetValue(country, out length)) return false; //Land ist unbekannt if (Regex.IsMatch (IBAN, "^[A-Z]{2}[0-9]{2}[A-Za-z0-9]{" + length + "}$")) return false; string IBANcheck = IBAN.Substring (4) + IBAN.Substring (0, 4); for(char c = 'A'; c <= 'Z'; c++) IBANcheck = IBANcheck.Replace(c.ToString(), ((int)c - 'A' + 10).ToString()); while (IBANcheck.Length > 8) { //die Zahl ist zu groß for long, zerlegen in mehrere Schritte int tmp = int.Parse (IBANcheck.Substring (0, 8)); IBANcheck = (tmp % 97) + IBANcheck.Substring (8); } return (int.Parse (IBANcheck)) % 97 == 1; } private static void test() { string[] valid = {"DE07 1234 1234 1234 1234 12", "DE07-1234-1234-1234-1234-12", "DE07123412341234123412", "AT84 1234 1234 1234 1234", "CH87 1234 1234 1234 1234 1"}; string[] invalid = {"DE19 1234 1234 1234 1234 12", "DE07 1234 1234 1234 1234 123", "AT84 1234 1234 1234 134"}; foreach (string s in valid) if (!IBANvalid(s)) Console.WriteLine("Fehler bei " + s); foreach (string s in invalid) if (IBANvalid(s)) Console.WriteLine("Fehler bei " + s); } static void Main(string[] args) { test (); while (true) { Console.Write ("IBAN eingeben: "); string iban = Console.ReadLine (); Console.WriteLine ("Die Addresse ist " + (IBANvalid(iban)? "" : "nicht ") + "gültig\n"); } } } }

public bool ibancheck(string iban) { //Hier kann man das Dictionary mit dem Ländercode und IBAN-Länge der // verschiedenen Ländern vervollständigen Dictionary<string, int> ibanLänder = new Dictionary<string, int>(); ibanLänder.Add("DE", 22); ibanLänder.Add("AT", 20); ibanLänder.Add("CH", 21); ibanLänder.Add("FR", 27); ibanLänder.Add("IT", 27); string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Blanke Zwischenräume und Bindestriche löschen iban = iban.Replace(" ", "").Replace("-", ""); // Ländercode prüfen if (!ibanLänder.ContainsKey(iban.Substring(0,2))) return false; // IBAN-Länge mit Wert aus Dictionary ibanLänder vergleichen if (ibanLänder[iban.Substring(0,2)] != iban.Length) return false; // Den Ländercod und die Prüfziffer von der IBAN trennen string iban2 = iban.Substring(4); // Index des Ländercodes im Alphabet feststellen, // 9 zum Index dazu zählen und an iban2 anfügen. int stelle = alphabet.IndexOf(iban[0]); stelle += 10; iban2 += stelle.ToString(); stelle = alphabet.IndexOf(iban[1]); stelle += 10; iban2 += stelle.ToString(); // Prüfziffer an iban2 anfügen iban2 += iban.Substring(2, 2); decimal zahl = Convert.ToDecimal(iban2); // Der Rest von Zahl mod 97 muß 1 sein, sonst ist die IBAN falsch decimal rest = zahl % 97; if (rest == 1) return true; return false; }
Dieses Programm arbeitet mit einer Windows Forms Oberfläche. Ich habe es nach meinem eigenen Geschmack verfeinert.
Bei Anregungen und Anmerkung gern ein Kommentar da lassen, bin nämlich noch ein Beginner in C#!
C#-Code
Bei Anregungen und Anmerkung gern ein Kommentar da lassen, bin nämlich noch ein Beginner in C#!

namespace typ_IbanPrüfung { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public string iban { get; set; } private void button1_Click(object sender, EventArgs e) { clearIBAN(iban); } private void button2_Click(object sender, EventArgs e) { selectLand(); } private string clearIBAN(string iban) { iban = textBox1.Text; string ibanCleared = iban.ToUpper().Replace(" ", "").Replace("-", ""); string ibanSwapped = ibanCleared.Substring(4) + ibanCleared.Substring(0, 4); string sum = ibanSwapped.Aggregate("", (current, c) => current + (char.IsLetter(c) ? (c - 55).ToString() : c.ToString())); var d = decimal.Parse(sum); if ((d % 97) == 1) { label3.Text = "Die Iban wurde korrekt auf Ihre Gültikeit geprüft!"; } else { label3.Text = "Die Iban ist falsch. Bitte überprüfen sie die Eingabe."; } return iban; } private void selectLand() { string land = comboBox1.Text; switch (land) { case "DE": textBox1.Text = "DE" + clearIBAN(iban); break; case "AT": textBox1.Text = "AT" + clearIBAN(iban); break; case "CH": textBox1.Text = "CH" + clearIBAN(iban); break; } } } }
Die Aufgabe ist zwar schon ein wenig älter, aber C# hat sich weiterentwickelt.
Hier eine Lösung mit NET Core 3.x (C#-8 erforderlich!):
C#-Code
Hier eine Lösung mit NET Core 3.x (C#-8 erforderlich!):

using System; using System.Collections.Generic; using System.Text.RegularExpressions; namespace CS_Aufgabe_74_IBAN { class Program { private static readonly Dictionary<string, int> IbanLenghts = new Dictionary<string, int>() { {"DE", 22 }, {"AT", 20}, {"CH", 21} }; static void Main(string[] args) { const string IBAN = "DE68 2105 0170 0012 3456 78"; var (iban, validation) = CheckIban(IBAN); Console.WriteLine($"IBAN '{iban}' is {validation}"); } static (string iban, string validation) CheckIban(string iban) { var r = Regex.Replace(iban, @"[ \-]+", ""); _ = IbanLenghts.TryGetValue(r[..2], out int l); if (r.Length != l || !Regex.IsMatch(r, @"\b[A-Z]{2}\d{"+(l-2)+"}")) return (r, "invalid"); _ = decimal.TryParse(r[4..] + (r[0] - 55) + (r[1] - 55) + r[2..4], out var d); return (r, d % 97 == 1 ? "valid" : "invalid"); } } }