Schreiben Sie eine Klasse SWIFT mit Klassenmethoden zur Erzeugung von IBAN (internationalen Kontonummern). Zur Vereinfachung soll dabei allgemein das System angewendet werden, das zur Bestimmung von IBAN deutscher Konten verwendet wird (obwohl für Konten in anderen Ländern eigentlich andere Systeme gelten). Eine IBAN ist demnach aus folgenden Elementen zusammengesetzt:
Kürzel des Landes (zwei Buchstaben, hier stets Großbuchstaben, z.B. DE für Deutschland)
Prüfzahl (2 Ziffern)
Bankleitzahl (8 Ziffern, keine 0 an erster Stelle)
Kontonummer (10 Ziffern, 0 an jeder Stelle möglich, aber nicht an allen zugleich)
Die Klassenmethode iban erhält als Eingaben
Landeskürzel als Zeichenkette der Länge 2 (z.B. "DE" oder "de" oder eine Mischform davon)
Bankleitzahl als 8-stellige Ganzzahl (z.B. 12345678)
Kontonummer als max. 10-stellige Ganzzahl (z.B. 123456)
und gibt die entsprechende IBAN als 22-stellige Zeichenkette zurück.
Die Umrechnung erfolgt gemäß folgender Vorgehensweise. Für jeden Schritt soll eine eigene Klassenmethode bereitgestellt werden.
Das zweibuchstabige Landeskürzel wird in Großbuchstaben umgewandelt.
(Methode landeskuerzel, die eine Zeichenkette annimmt und eine zurückgibt)
Die Bankleitzahl wird in eine 8-stellige Zeichenkette verwandelt.
(Methode bankleitzahl, die eine Ganzzahl annimmt und eine Zeichenkette zurückgibt)
Die Kontonummer wird in eine 10-stellige Zeichenkette verwandelt, ggf. durch führende ’0’en – z.B. 123456 in "0000123456".
Hinweis: Überlegen Sie, welchen Zahltyp Sie verwenden müssen, um alle Kontonummern darstellen zu können.
(Methode kontonummer, die eine Ganzzahl annimmt und eine Zeichenkette zurückgibt)
Aus der Bankleitzahl und der Kontonummer wird durch Aneinanderhängen der Bankleitzahl gefolgt von der 10-stelligen Form der Kontonummer die 18-stellige BBAN erzeugt – diese wäre z.B. "123456780000123456" für die Bankleitzahl 12345678 und die Kontonummer 123456.
(Methode bban, die Bankleitzahl und Kontonummer als Ganzzahlen annimmt und eine Zeichenkette zurückgibt)
Jeder der beiden (Groß-)Buchstaben des Ländercodes lässt sich auf folgende Weise in eine 2-stellige Zahl umgewandeln:
Von dem Buchstaben wird der Buchstabe ’A’ abgezogen.
Hinweis: Man kann mit Zeichen wie mit Zahlen rechnen – dies haben wir noch nicht behandelt, kann hier aber einfach verwendet werden: Wenn die Zeichenvariable b einen Großbuchstaben enthält, gibt der Ausdruck b - ’A’ die Position des Buchstaben im Alphabet an, gezählt ab 0.
Zu dem resultierenden Wert wird 10 addiert.
So ergibt sich jeweils eine Zahl von 10 (für den Buchstaben ’A’) bis 35 (für ’Z’) – für ’D’ erhält man 3 + 10 = 13, für ’E’ 4 + 10 = 14.
(Methode zahlFuerUpper nimmt ein Zeichen an, das ein Großbuchstabe sein muss, und gibt den entsprechenden Zahlwert zurück)
Für die folgende Berechnung ist die BBAN um einen temporären Anhang zu ergänzen. Dieser setzt sich zusammen aus:
der 2-stelligen Zahldarstellung des ersten Buchstabens des Landeskürzels
der 2-stelligen Zahldarstellung des zweiten Buchstabens
zwei Nullen
Es ergibt sich ein 6-stelliger Anhang als Zeichenkette – für die o.g. Beispiele "131400".
(Methode bbanErgaenzung nimmt das Landeskürzel als Zeichenkette aus zwei Großbuchstaben an und gibt den Anhang als Zeichenkette zurück)
Für die aus der BBAN und dem Anhang zusammengesetzte 24-stellige Zahl (im gegebenen Beispiel "123456780000123456131400") wird der Modulo (Rest) bezüglich 97 berechnet.
Eine 24-stellige Dezimalzahl übersteigt den Wertebereich von int und long. Deshalb verwendet man dafür folgenden Algorithmus (hier ohne Beweis):
Extrahiere die Zahl, die aus den ersten max. 9 (ggf. weniger) Ziffern gebildet wird.
Hinweis: Die Klassenmethode parseLong in der Klasse Long nimmt eine Zeichenkette an, die aus Ziffern besteht. Sie gibt die Ganzzahl zurück, die durch diese Ziffern dargestellt wird.
Berechne den Modulo dieser Zahl bezüglich 97.
Dieser (ein- oder zweistellige) Wert wird vor die übrige (zu Beginn 24 ́ 9 “ 15-stellige) Zeichenkette gehängt.
Fahre wieder ab dem ersten Schritt fort, bis keine Ziffern mehr übrig sind.
Wenn die gesamte Zeichenkette verarbeitet ist (nach max. 4 Wiederholungen), ist der zuletzt berechnete Modulo der der gesamten Zahl.
Für das o.g. Beispiel 123456780000123456131400:
123456780 mod 97 = 30300001234 mod 97 = 22225613140 mod 97 = 64640 mod 97 = 58
Also ist 123456780000123456131400 mod 97 = 58.
(Methode zahlAlsStringMod97 nimmt eine Zeichenkette aus Ziffern an und gibt den Modulo als Ganzzahl zurück)
Danach subtrahiert man diesen Modulo-Wert von dem Wert 98 und betrachtet das Ergebnis als Zeichenkette. Wenn das Ergebnis einstellig, also kleiner als 10 ist, fügt man eine führende Null hinzu, so dass sich stets eine zweistellige Zeichenkette ergibt. Diese beschreibt die Prüfzahl. Im o.g. Beispiel ist die Prüfzahl 98 - 58 = 40.
(Methode pruefzahl nimmt das Landeskürzel in Großbuchstaben sowie die BBAN als Zeichenketten an und gibt die Prüfzahl als zweistellige Zeichenkette zurück.)
Hinweise:
Das Verfahren ist in genau dieser Form nur für deutsche Konten definiert, für andere Länder in ähnlicher, aber anderer Weise. Ihre Implementierung soll auch mit anderen Länderkürzeln in gleicher Form umgehen (z.B. "FR" für Frankreich), obwohl das offizielle Verfahren für diese Länder ein anderes ist.
Für deutsche Testdaten können Sie Ihre Ergebnisse mit denen eines der vielen online-IBAN-Rechner vergleichen.
Aufgabe 1 [Programmierung]
Schreiben Sie eine Klasse SWIFT mit Klassenmethoden zur Erzeugung von IBAN (internationalen Kontonummern). Zur Vereinfachung soll dabei allgemein das System angewendet werden, das zur Bestimmung von IBAN deutscher Konten verwendet wird (obwohl für Konten in anderen Ländern eigentlich andere Systeme gelten). Eine IBAN ist demnach aus folgenden Elementen zusammengesetzt:
Kürzel des Landes (zwei Buchstaben, hier stets Großbuchstaben, z.B. DE für Deutschland)
Prüfzahl (2 Ziffern)
Bankleitzahl (8 Ziffern, keine 0 an erster Stelle)
Kontonummer (10 Ziffern, 0 an jeder Stelle möglich, aber nicht an allen zugleich)
Die Klassenmethode iban erhält als Eingaben
Landeskürzel als Zeichenkette der Länge 2 (z.B. "DE" oder "de" oder eine Mischform davon)
Bankleitzahl als 8-stellige Ganzzahl (z.B. 12345678)
Kontonummer als max. 10-stellige Ganzzahl (z.B. 123456)
und gibt die entsprechende IBAN als 22-stellige Zeichenkette zurück.
Die Umrechnung erfolgt gemäß folgender Vorgehensweise. Für jeden Schritt soll eine eigene Klassenmethode bereitgestellt werden.
Das zweibuchstabige Landeskürzel wird in Großbuchstaben umgewandelt. (Methode landeskuerzel, die eine Zeichenkette annimmt und eine zurückgibt)
Die Bankleitzahl wird in eine 8-stellige Zeichenkette verwandelt. (Methode bankleitzahl, die eine Ganzzahl annimmt und eine Zeichenkette zurückgibt)
Die Kontonummer wird in eine 10-stellige Zeichenkette verwandelt, ggf. durch führende ’0’en – z.B. 123456 in "0000123456". Hinweis: Überlegen Sie, welchen Zahltyp Sie verwenden müssen, um alle Kontonummern darstellen zu können. (Methode kontonummer, die eine Ganzzahl annimmt und eine Zeichenkette zurückgibt)
Aus der Bankleitzahl und der Kontonummer wird durch Aneinanderhängen der Bankleitzahl gefolgt von der 10-stelligen Form der Kontonummer die 18-stellige BBAN erzeugt – diese wäre z.B. "123456780000123456" für die Bankleitzahl 12345678 und die Kontonummer 123456. (Methode bban, die Bankleitzahl und Kontonummer als Ganzzahlen annimmt und eine Zeichenkette zurückgibt)
Jeder der beiden (Groß-)Buchstaben des Ländercodes lässt sich auf folgende Weise in eine 2-stellige Zahl umgewandeln:
Von dem Buchstaben wird der Buchstabe ’A’ abgezogen. Hinweis: Man kann mit Zeichen wie mit Zahlen rechnen – dies haben wir noch nicht behandelt, kann hier aber einfach verwendet werden: Wenn die Zeichenvariable b einen Großbuchstaben enthält, gibt der Ausdruck b - ’A’ die Position des Buchstaben im Alphabet an, gezählt ab 0.
Zu dem resultierenden Wert wird 10 addiert.
So ergibt sich jeweils eine Zahl von 10 (für den Buchstaben ’A’) bis 35 (für ’Z’) – für ’D’ erhält man 3 + 10 = 13, für ’E’ 4 + 10 = 14. (Methode zahlFuerUpper nimmt ein Zeichen an, das ein Großbuchstabe sein muss, und gibt den entsprechenden Zahlwert zurück)
Für die folgende Berechnung ist die BBAN um einen temporären Anhang zu ergänzen. Dieser setzt sich zusammen aus:
der 2-stelligen Zahldarstellung des ersten Buchstabens des Landeskürzels
der 2-stelligen Zahldarstellung des zweiten Buchstabens
zwei Nullen Es ergibt sich ein 6-stelliger Anhang als Zeichenkette – für die o.g. Beispiele "131400". (Methode bbanErgaenzung nimmt das Landeskürzel als Zeichenkette aus zwei Großbuchstaben an und gibt den Anhang als Zeichenkette zurück)
Für die aus der BBAN und dem Anhang zusammengesetzte 24-stellige Zahl (im gegebenen Beispiel "123456780000123456131400") wird der Modulo (Rest) bezüglich 97 berechnet. Eine 24-stellige Dezimalzahl übersteigt den Wertebereich von int und long. Deshalb verwendet man dafür folgenden Algorithmus (hier ohne Beweis):
Extrahiere die Zahl, die aus den ersten max. 9 (ggf. weniger) Ziffern gebildet wird. Hinweis: Die Klassenmethode parseLong in der Klasse Long nimmt eine Zeichenkette an, die aus Ziffern besteht. Sie gibt die Ganzzahl zurück, die durch diese Ziffern dargestellt wird.
Berechne den Modulo dieser Zahl bezüglich 97.
Dieser (ein- oder zweistellige) Wert wird vor die übrige (zu Beginn 24 ́ 9 “ 15-stellige) Zeichenkette gehängt.
Fahre wieder ab dem ersten Schritt fort, bis keine Ziffern mehr übrig sind.
Wenn die gesamte Zeichenkette verarbeitet ist (nach max. 4 Wiederholungen), ist der zuletzt berechnete Modulo der der gesamten Zahl.
Für das o.g. Beispiel 123456780000123456131400:
123456780 mod 97 = 30
300001234 mod 97 = 22
225613140 mod 97 = 64
640 mod 97 = 58
Also ist123456780000123456131400 mod 97 = 58
. (Methode zahlAlsStringMod97 nimmt eine Zeichenkette aus Ziffern an und gibt den Modulo als Ganzzahl zurück)Danach subtrahiert man diesen Modulo-Wert von dem Wert 98 und betrachtet das Ergebnis als Zeichenkette. Wenn das Ergebnis einstellig, also kleiner als 10 ist, fügt man eine führende Null hinzu, so dass sich stets eine zweistellige Zeichenkette ergibt. Diese beschreibt die Prüfzahl. Im o.g. Beispiel ist die Prüfzahl
98 - 58 = 40
. (Methode pruefzahl nimmt das Landeskürzel in Großbuchstaben sowie die BBAN als Zeichenketten an und gibt die Prüfzahl als zweistellige Zeichenkette zurück.)Hinweise:
Das Verfahren ist in genau dieser Form nur für deutsche Konten definiert, für andere Länder in ähnlicher, aber anderer Weise. Ihre Implementierung soll auch mit anderen Länderkürzeln in gleicher Form umgehen (z.B. "FR" für Frankreich), obwohl das offizielle Verfahren für diese Länder ein anderes ist.
Für deutsche Testdaten können Sie Ihre Ergebnisse mit denen eines der vielen online-IBAN-Rechner vergleichen.