C# IBAN "Rechner": Wie kann ich die IBAN in BLZ und Konto-Nr. zerteilen?
Hallo,
ich programmiere gerade eine Anwendung, die, wenn man BLZ und Konto-Nr eingibt, die IBAN "errechnet". Jetzt habe ich die IBAN berechnet, will aber, dass bei dem tabControl bei "IBAN zerteilen" die "errechnete" IBAN vom IBAN generieren Tab dort bei der IBAN-Textbox angezeigt wird und wenn ich auch den zerteilen Button anklicke, er mir die BLZ und Konto-Nr zurückgibt. Also genau umgekehrt.
Thx.
Hier der bisher bestehende Code:
public void buttonGenerieren_Click(object sender, EventArgs e){ string knr, blz, ergebnis; knr = textBoxKontoNrGenerieren.Text; blz = textBoxBlzGenerieren.Text; double num; if ((double.TryParse(knr, out num)) && (double.TryParse(blz, out num))) { ergebnis = CreateIBAN("DE", blz, knr) textBoxIbanGenerieren.Text = ergebnis; } else { textBoxKontoNrGenerieren.Text = ""; textBoxBlzGenerieren.Text = ""; } } string CreateIBAN(string lkz, string blz, string kntnr, bool groupedReturn = true) { string bban = string.Empty; lkz = lkz.ToUpper(); switch(lkz) { case "AT": { bban = blz.PadLeft(5, '0') + kntnr.PadLeft(11, '0'); } break; case "DE": { bban = blz.PadLeft(0, '0') + kntnr.PadLeft(10, '0'); } break; case "CH": { bban = blz.PadLeft(5, '0') + kntnr.PadLeft(12, '0'); } break; } string sum = bban + lkz.Aggregate("", (current, c) => current + (c - 55).ToString()) + "00"; var d = decimal.Parse(sum); var checksum = 98 - (d % 97); string iban = lkz + checksum.ToString().PadLeft(2, '0') + bban; return groupedReturn ? iban.Select(c, i) => (i % 4 == 3) ? c + " " : c + "").Aggregate("", (current, c) => current + c) : iban; } public void buttonZerteilen_Click(object sender, EventArgs e) { // Was kommt jetzt hier rein? }
3 Antworten
Es gibt über dem Eingabefenster ein Symbol, das ungefähr so aussieht: <>
Wenn du darauf klickst, wird der zugehörige Absatz als Code formatiert, was deutlich übersichtlicher ist.
(Auch ohne das kann man mit Umschalt + Leertaste einen einfachen Zeilenumbruch erzeugen.)
Ansonsten gibt es mehrere Stellen im Internet, die sich auf das Veröffentlichen von Codebeispielen spezialisiert haben, auch kostenlose.
-----
Für DE ist die IBAN nach Länge teilbar. (Wenn du auch andere Länder berücksichtigen willst, musst du eine ziemlich umfangreiche Datenbank mit Teilungsregeln verwenden.)
Damit kannst du für IBANs aus DE ganz einfach mit Substring(start, length) arbeiten.
Wenn man sich die Zeilenumbrüche im Code dazudenkt, ist das immer noch etwas besser als der Durchschnitt auf thedailywtf.com.
Allerdings stehe ich auf dem Standpunkt, dass man gerade Anfängern keine solchen Monstrositäten beibringen sollte, sondern, wie man wartbaren Code schreibt.
- Keine Angst vor einzeiligen Methoden.
- Solche wahrscheinlich mehrfach verwendbaren Verfahren in eigene Prozeduren auslagern, anstatt Ereignishandler unnötig lang zu machen. (Ich persönlich neige dazu, besonders Ereignishandler grundsätzlich kurz und übersichtlich zu halten.)
- Solche Verwurschtelungen wie geschachtelte bedingte ternäre Ausdrücke, Lambda-Funktionen etc. bringt man den Schülern/Studenten bitte erst dann bei, wenn man erwarten darf, dass sie die Grundlagen beherrschen. Und dann gibt man ihnen so einen Ausdruck mit einem subtilen Bug drin, den sie beseitigen müssen - anders lernen die wenigsten, wartbaren Code zu schreiben.
- Woher kommt der Quark, Strings mit Aggregate statt String.Join() zusammenzusetzen? Wenn man schon so was verwendet und sich den Platz für ein .ToArray() sparen will, kann man dann auch gleich eigene Erweiterungsmethoden zusammenschustern. Und was ist mit den sonstigen Formatierungsmöglichkeiten? (abgesehen davon, dass Auslösen, Bearbeitung und Ausgabe/Formatierung wesentlich besser wartbar und portierbar sind, wenn man sie sauber getrennt hält. Nach meiner Erfahrung kommt nach spätestens 10 Jahren die Anforderung, das Zeug auf eine andere Umgebung zu portieren, und dann muss man das Knäuel aus UI-ein, Logik und UI-aus wieder aufdröseln, ohne dass sich irgendjemand erinnern kann, was sich der Ersteller des Codes seinerzeit dabei gedacht hat.)
Ist das eine Art Hausübung zum Programmieren-Lernen?
Zuerst ein paar Anmerkungen zu deinem Code:
1) Verwende richtige, aussagekräftige Namen und halte dich an C#-Konventionen. Das heißt, Methodennamen beginnen mit Großbuchstaben und bei Bezeichnern wird generell die Kamelhöckerschreibweise benutzt. So lange du die Konventionen noch nicht drin hast, sollten Ausdrücke wie var für dich tabu sein.
2) Fasse Deklaration und Definition zu einer Initialisierung zusammen. Das spart an Zeilen und macht den Code generell übersichtlicher.
3) Lasse die Delimiter um die einzelnen switch-cases weg, schließlich sind die Anweisungen eh einzeilig.
4) Bleibe stringent. Wenn du string.Empty nutzt, dann tu das in jedem Fall.
5) Statt TryParse würde ich wohl Parse verwenden und dies in einem try-catch ausführen. Schließlich wird die Variable num nicht einmal verwendet.
6) Wieso verwendest du die Aggregate-Methode?
7) Wieso ist dieser Parse-Vorgang ungesichert?
var d = decimal.Parse(sum);
8) Hier fehlt das Semikolon nach dem Methodenaufruf:
ergebnis = CreateIBAN("DE", blz, knr)
Zu deiner Frage:
Ich sehe nicht, wo dein Problem liegt. In CreateIBAN beschreibst du doch bereits den Encoding-Vorgang, den musst du doch nun nur noch umdrehen. Die Methoden der Klasse String helfen dir dabei, sie werden in der MSDN-Dokumentation gelistet.
Pack deinen Sourcecode bitte in die Code-Tags
MFG xGlumi
Noch besser: pastebin!
Nicht nur "besser"... Viel besser!
- Syntax-Highlighting (Nicht unbedingt nötig, aber sieht besser aus...)
- Keine dämlichen Bugs (versuch mal hier HTML in nen Code-Block einzufügen... Nicht eintippen, einfügen...)
- Falls nötig auch direkt als Textdatei abspeicherbar (ohne die Notwendigkeit, mit einer Genauigkeit von <0.5 Nanopixeln mit der Maus zu markieren und dann zu kopieren... ;)
- Alles, was ich noch vergessen habe zu erwähnen...
Copy & Paste in gf-Edicutor-Fenster funktioniert in Iceweasel unter Debian-Linux praktisch problemlos ...
Auch für HTML?
Zumindest bei mir funktioniert das Einfügen von HTML-Code selbst innerhalb eine Code-Blocks nicht (Seamonkey, Arch-Linux)...
Allerdings konnte ich diverse Formatierungsprobleme des Editors (der für Antworten und Kommentare) mit folgendem "User-Style" "beheben":
@namespace urlhttp://www.w3.org/1999/xhtml); @-moz-document domain(www.gutefrage.nett") { textarea.ng-hide{ display: block !important; width: 100%; height: 200px; } }
Damit bekommt man unterhalb des Editors eine "textarea", in der man den Text der Antwort/des Kommentars direkt in HTML bearbeiten kann. Ist teilweise ganz praktisch, wenn der Editor mal wieder rumspinnt...
Die Tags werden vom GF-Editor gefiltert, sofern man den Text über die Zwischenablage einfügt. Entweder wird dann der Text kopiert und die erkannten Tags entfernt (was bspw. bei Java-Code mit generischen Typen ziemlich nervig ist) oder es kommt gar nichts an. Manuelles Eintippen hingegen funktioniert.
Vor einiger Zeit habe ich für einen Feuerwehr Kameraden mal was ähnliches programmiert. Damals war es glaube ich für irgendein Informatik Modul in einem Wirtschaftsstudienfach. Soll heißen, dass die Aufgabe scheinbar an der Uni gestellt wird. Der Sourcecode ist aber tatsächlich eine Zumutung. LG Norman