IBAN generieren (Deutschland) aus Abfrage von BLZ und Kontonummer?

Das habe ich irgendwann mal für ein Schulprojekt gemacht. Ich kann aber nicht garantieren, dass das so richtig ist.
Java:
    /**
     * This method creates a valid German IBAN
     * @return Account number
     */
    public static String generateAccountNumber() {
        String countryCode = "DE";
        String gerRecognitionNumber = "131400";
        String blz = "85203647";
        String accountNumber = "";
        String bban;
        String iban;

        //create a random account number
        for (int i = 0; i < 10; i++) {
            int random = new Random().nextInt(9);
            accountNumber = accountNumber + random;
        }

        bban = blz + accountNumber;

        String checkSumString = bban + gerRecognitionNumber;

        //calculate the checksum
        BigInteger checkSum = new BigInteger(checkSumString).mod(new BigInteger("97"));

        //if checksum is smaller than 10 add a leading 0
        if (checkSum.intValue() < 10) {
            checkSumString = "0" + checkSum.toString();
        } else {
            checkSumString = checkSum.toString();
        }

        return countryCode + checkSumString + blz + accountNumber;
    }
 
Das habe ich irgendwann mal für ein Schulprojekt gemacht. Ich kann aber nicht garantieren, dass das so richtig ist.
Java:
    /**
     * This method creates a valid German IBAN
     * @return Account number
     */
    public static String generateAccountNumber() {
        String countryCode = "DE";
        String gerRecognitionNumber = "131400";
        String blz = "85203647";
        String accountNumber = "";
        String bban;
        String iban;

        //create a random account number
        for (int i = 0; i < 10; i++) {
            int random = new Random().nextInt(9);
            accountNumber = accountNumber + random;
        }

        bban = blz + accountNumber;

        String checkSumString = bban + gerRecognitionNumber;

        //calculate the checksum
        BigInteger checkSum = new BigInteger(checkSumString).mod(new BigInteger("97"));

        //if checksum is smaller than 10 add a leading 0
        if (checkSum.intValue() < 10) {
            checkSumString = "0" + checkSum.toString();
        } else {
            checkSumString = checkSum.toString();
        }

        return countryCode + checkSumString + blz + accountNumber;
    }
komme damit leider nicht zurecht, gibt mir nur Fehler aus 🙁
 
Java:
public class IBAN {

    public static void main (String [] args) {
    }
    
    public static String generateAccountNumber() {
        String countryCode = "DE";
        String gerRecognitionNumber = "131400";
        String blz = "85203647";
        String accountNumber = "";
        String bban;
        String iban;

        //create a random account number
        for (int i = 0; i < 10; i++) {
            int random = new Random().nextInt(9);
            accountNumber = accountNumber + random;
        }

        bban = blz + accountNumber;

        String checkSumString = bban + gerRecognitionNumber;

        //calculate the checksum
        BigInteger checkSum = new BigInteger(checkSumString).mod(new BigInteger("97"));

        //if checksum is smaller than 10 add a leading 0
        if (checkSum.intValue() < 10) {
            checkSumString = "0" + checkSum.toString();
        } else {
            checkSumString = checkSum.toString();
        }

        return countryCode + checkSumString + blz + accountNumber;
    
}
}
Java:

Bekomme da irgendwie gar nichts
 
"Bekomme da irgendwie gar nichts"
Was steht denn in deiner main-Methode? Was macht die denn?

Nebenbei was Unwichtiges: Initialisierre "new Random()." nur einmal außerhalb der Schleife und greife wiederholt darauf zu.
 
Aber Du wirst doch lesen können, dass Deine main-Methode leer ist. Außerdem fehlen die Imports (Random, BigInteger und evtl. noch was, das ich übersehen habe).
 
Wenn eine Klasse ausführbar sein soll, dann muss sie eine main-Methode der Form haben, wie du sie oben stehen hast, so weit ok.
In dieser Methode steht nun, was das Programm eigentlich machen soll.
In deinem Fall: Gar nichts
Was sollte dein Programm denn machen?
Schreib das mal in die Main-Methode rein, von mir aus auch in Worten und schreib "//" davor, dann wird's ein Kommentar.
Möchtest du irgendwas im Konsolenfenster sehen? Dann schreib in dein Main-Programm, dass du etwas im Konsolenfenstger sehen möchtest.
Danach suchst du nach dem passenden Befehl dafür.



Mein Tip: Schreib mal ein Programm, das "Hello World" auf der Konsole ausgibt. Fang klein an. Vergiss die IBAN-Nummer.


 
Zuletzt bearbeitet:
Java:
import java.math.BigInteger;

public class IBAN {
public static void main(String[] args) {
String r = args[0]; // Bankleitzahl
String s = args[1]; // Kontonummer, auf 10 Ziffern erweitern
while (s.length()<10) {
s = "0"+s;
}
BigInteger x = new BigInteger(""+r+s+"131400");
BigInteger z = new BigInteger("97");
x = x.mod(z);
int y = 98-x.intValue(); // evtl. um führende 0 ergänzen
System.out.println ("DE"+y+r+s);

}
}

Eclipse spuckt mir nur "
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at IBAN.main(IBAN.java:5)"

aus
 
Das passiert, da du beim Ausfähren keine Kommandozeilenparameter mit angegeben hast.
args ist ein Array, das deine Kommandozeilenparameter beinhaltet.
Wenn du args[0] verwenden willst, dann muss args eine Länge von mindestens 1 haben.
Für args[1] muss es eine Länge von mindestens 2 haben.


Ehrlich ... vergiss den IBAN mal und fang mit den Grundlagen von Java an.
 
Java:
import java.math.BigInteger;
import java.util.Scanner;

public class IBAN {
    public static void main(String[] args) {
        String Kontonummer;
        String BLZ;

        Scanner input = new Scanner(System.in);

        System.out.print("Kontonummer: ");
        Kontonummer = input.nextLine();

        System.out.print("BLZ: ");
        BLZ = input.nextLine();

        // Zusammensetzung Ziffern
        String Laendercodedeutschland = "131400";
        String ibangrundlage = BLZ + Kontonummer + Laendercodedeutschland;

        //berechnung1
        String berechnung1 = "";
        String berechnung2 = "";
        String berechnung3 = "";
        String berechnung4 = "";
        String berechnung5 = "";


        //Unterteilung der BLZ und Kontonummer
        for(int i =0; i<ibangrundlage.length();i++){
            if(i<=8){
                berechnung1 += ibangrundlage.charAt(i);
            } else if(i>8 && i<=15){
                berechnung2 += ibangrundlage.charAt(i);
            } else if(i>15 && i<=22){
                berechnung3 += ibangrundlage.charAt(i);
            } else if(i>22){
                berechnung4 += ibangrundlage.charAt(i);
            }
        }

        berechnung2 = berechnezwischenziffer(berechnung1 )+ berechnung2;

        berechnung3 = berechnezwischenziffer(berechnung2 )+ berechnung3;

        berechnung4 = berechnezwischenziffer(berechnung3 )+ berechnung4;

        berechnung5 = berechnezwischenziffer(berechnung4);

        int endergebnis = 98 - Integer.parseInt(berechnung5);
        String prüfziffer = String.valueOf(endergebnis);

        String iban = "DE" +  prüfziffer  +  BLZ  +  Kontonummer ;            //iban ausgabe
        System.out.println("IBAN: "+ iban);

    }
        //methode zur Berechnung der zwischenziffern zur Ermittlung der Prüfziffer
        public static String berechnezwischenziffer(String berechnungssumme) {
            int berechnungsumme = Integer.parseInt(berechnungssumme);
            int vergleichssumme = berechnungsumme;
            berechnungsumme /= 97;
            berechnungsumme *= 97;
            int differenz = vergleichssumme - berechnungsumme;
            if (differenz<10){
                differenz = Integer.parseInt("0") + differenz;
            }
            String differenzsumme= String.valueOf(differenz);
            return differenzsumme;
        }


}

So, ich hab nur noch zwei Fragen.
1. Die IBAN wird falsch berechnet.. Kann mir das einer erklären und den Fehler zeigen?
2. Wie schaffe ich es, dass bei der IBAN nach allen 4 Ziffern eine Leerzeile kommt?
 
Java:
import java.math.BigInteger;
import java.util.Scanner;

public class IBAN {
    public static void main(String[] args) {
        String Kontonummer;
        String BLZ;

        Scanner input = new Scanner(System.in);

        System.out.print("Kontonummer: ");
        Kontonummer = input.nextLine();

        System.out.print("BLZ: ");
        BLZ = input.nextLine();

        // Zusammensetzung Ziffern
        String Laendercodedeutschland = "131400";
        String ibangrundlage = BLZ + Kontonummer + Laendercodedeutschland;

        //berechnung1
        String berechnung1 = "";
        String berechnung2 = "";
        String berechnung3 = "";
        String berechnung4 = "";
        String berechnung5 = "";


        //Unterteilung der BLZ und Kontonummer
        for(int i =0; i<ibangrundlage.length();i++){
            if(i<=8){
                berechnung1 += ibangrundlage.charAt(i);
            } else if(i>8 && i<=15){
                berechnung2 += ibangrundlage.charAt(i);
            } else if(i>15 && i<=22){
                berechnung3 += ibangrundlage.charAt(i);
            } else if(i>22){
                berechnung4 += ibangrundlage.charAt(i);
            }
        }

        berechnung2 = berechnezwischenziffer(berechnung1 )+ berechnung2;

        berechnung3 = berechnezwischenziffer(berechnung2 )+ berechnung3;

        berechnung4 = berechnezwischenziffer(berechnung3 )+ berechnung4;

        berechnung5 = berechnezwischenziffer(berechnung4);

        int endergebnis = 98 - Integer.parseInt(berechnung5);
        String prüfziffer = String.valueOf(endergebnis);

        String iban = "DE" +  prüfziffer  +  BLZ  +  Kontonummer ;            //iban ausgabe
        System.out.println("IBAN: "+ iban);

    }
        //methode zur Berechnung der zwischenziffern zur Ermittlung der Prüfziffer
        public static String berechnezwischenziffer(String berechnungssumme) {
            int berechnungsumme = Integer.parseInt(berechnungssumme);
            int vergleichssumme = berechnungsumme;
            berechnungsumme /= 97;
            berechnungsumme *= 97;
            int differenz = vergleichssumme - berechnungsumme;
            if (differenz<10){
                differenz = Integer.parseInt("0") + differenz;
            }
            String differenzsumme= String.valueOf(differenz);
            return differenzsumme;
        }


}

So, ich hab nur noch zwei Fragen.
1. Die IBAN wird falsch berechnet.. Kann mir das einer erklären und den Fehler zeigen?
2. Wie schaffe ich es, dass bei der IBAN nach allen 4 Ziffern eine Leerzeile kommt?
Zu 1. Nen.

Erster Schritt bei einer Fehlerkorrektur: Fehler benennen. Falsch berechnet ist keine Fehlerbeschreibung. Was ist falsch? In welcher Form ist es falsch? Was wäre denn richtig?
 
Der Algorithmus lässt es einem kalt den Rücken runter laufen. Wie bist Du auf den Code gekommen?

a) Was macht dieser Code bitte? Was wird da in Differenz berechnet?
Java:
            int vergleichssumme = berechnungsumme;
            berechnungsumme /= 97;
            berechnungsumme *= 97;
            int differenz = vergleichssumme - berechnungsumme;

b) Was erwartest Du von diesem Code?
Java:
            if (differenz<10){
                differenz = Integer.parseInt("0") + differenz;
            }

Hier wäre eine erste Frage, wieso Du da eine führende 0 haben möchtest (Das soll wohl das Ziel sein ...)
Und die zweite Frage wäre, was da in dem Code wirklich passiert.

c) Kontonummer muss 10-Stellig sein - das prüfst Du aber nicht wenn Du alles zusammen baust:
Java:
String ibangrundlage = BLZ + Kontonummer + Laendercodedeutschland;

Das wären erst einmal meine Hinweise zu dem Code. Dabei ist a und b einfach nur ein Hinweis, dass der Code so zwar etwas schwachsinnig ist, aber erst einmal nichts falsches machen sollte.
 
Ach ja - bei der Prüfziffer ist auch noch etwas falsch ... da hätte ggf. etwas rein gemusst das Du bei b) machen wolltest ...
 
[CODE lang="java" title="Ausrechnen"] import java.math.BigInteger;

/**
* Diese Klasse stellt Methoden zu Berechnung der IBAN
* @version 1.0
* @author
*
*/
public class Iban {

//Attribute
/**
* Fertige IBAN
*
*/
String iban; //Atribut1
/**
* Kontonummer
*/
String accountNumber; //Attribut2
/**
* Ländererkennung
*/
String countryRecognition; //Atribut3
/**
* Bankleitzahl
*/
String bankCode; //Atribut4


//Konstruktor

/**
* Konstruktor für die IBAN Berechnung
* @param country Ländererkennung
* @param bankCode2 Bankleitzahl
* @param account Kontonummer
*/
public Iban(String country, String bankCode2, String account) {
this.accountNumber = account;
this.countryRecognition = country;
this.bankCode = bankCode2;
this.iban = splitBan();

}

// Kontonummer 10 Stellig machen
private String accountNumber10() {
for (int i = accountNumber.length(); i < 10; i++) {
accountNumber = "0" + accountNumber;
}
return accountNumber;
}

//Zusammenfügen BLZ und Kontonr
private String bankCodeAccount() {

return bankCode + accountNumber10();
}

//Länderkenz in Zahlen
private int letterToNumber(char a) {
int number = a - 64;
number += 9;

return number;

}

//Zusammenfügen der beiden BuchstabenZahlen
private String country() {
String partOne = Integer.toString(letterToNumber(this.countryRecognition.charAt(0)));
String partTwo = Integer.toString(letterToNumber(this.countryRecognition.charAt(1)));

return partOne + partTwo + "00";

}


//Zusammenfügen von allem
private String bankCodeAccountCountry() {

return bankCodeAccount() + country();
}


//Prüfsumme
private String finalCheckSum() {

//Zahlen in BigInt und Modulo und Substrahieren
BigInteger firstIban = new BigInteger(bankCodeAccountCountry());
BigInteger modNumber = new BigInteger("97");
BigInteger subtractor = new BigInteger("98");

BigInteger test = firstIban.mod(modNumber);
BigInteger test1 = subtractor.subtract(test);


//BigInt zurück in Int sonst geht nix

int checkSum = test1.intValue();

//falls Prüfsumme nicht 2Stellig ist, eine 0 hinzufügen
if (checkSum < 10) {
return countryRecognition + "0" + checkSum + bankCodeAccount();
}
else {
return countryRecognition + checkSum + bankCodeAccount();
}
}
private String splitBan() {

String s1 = finalCheckSum().substring(0, 4);
String s2 = finalCheckSum().substring(4, 8);
String s3 = finalCheckSum().substring(8, 12);
String s4 = finalCheckSum().substring(12, 16);
String s5 = finalCheckSum().substring(16, 20);
String s6 = finalCheckSum().substring(20, 22);

return s1 + " " + s2 + " " + s3 + " " + s4 + " " + s5 + " " + s6;
}

/**
* Stellt die fertige IBAN zu verfügung
*/
public void printIban() {
System.out.println(this.iban);
}
}[/CODE]
[CODE lang="java" title="Main"]
/**
* Main Methode
* @version 1.0
* @author
*
*/
public class Main {

/**
* Spuckt die fertige IBAN aus
* @param args a
*/
public static void main(String[] args) {
Iban ibanTest = new Iban(args[0], args[1], args[2]);
ibanTest.printIban();

}

}[/CODE]


War mal eine Uni Aufgabe aus dem letzten Semester
 
Sorry, ich unterbreche die akrobatischen Kunststücke mal:
Java:
import java.math.BigInteger;

public class Iban {
    public static String convertToIban(String konto, String blz) {
        while (konto.length() < 10) {
            konto = "0" + konto;
        }
        String bban = blz + konto;
        String prof1 = bban + "131400";
        BigInteger prof2 = BigInteger.ZERO;
        for (char i : prof1.toCharArray()) {
            prof2 = prof2.multiply(BigInteger.TEN);
            prof2 = prof2.add(BigInteger.valueOf(i - '0'));
        }
        prof2 = prof2.mod(BigInteger.valueOf(97));
        int prof3 = 98 - prof2.intValue();
        String iban = "DE" + String.format("%02d", prof3) + bban;

        System.out.println(konto);
        System.out.println(blz);
        System.out.println(prof1);
        System.out.println(prof2);
        System.out.println(prof3);

        return iban;
    }

    public static void main(String[] args) {
        System.out.println(convertToIban("4444333322", "88866655"));
        System.out.println(convertToIban("1234567890", "10000000"));
        System.out.println(convertToIban("9999999999", "99999999"));
    }
}
 
Diese BigInteger Ansätze braucht es doch gar nicht. Der Ansatz, da einfach den String zu unterteilen und in mehreren Schritten zu rechnen, ist doch bereits in Ordnung.

Der eigentliche Fehler in dem Code war ja nur, dass die Kontonummer nicht auf 10 Zeichen ergänzt wurde und dass die Kontrollziffer nicht auf zwei Stellen genommen wurde.

Die Zwischenrechnung kann man dann einfach so schreiben:
Java:
    public static String berechnezwischenziffer(String berechnungssumme) {
        return "" + (Integer.parseInt(berechnungssumme) % 97);
    }

Daher bei der Variable Kontonummer mit einer Schleife so lange "0" davor hängen, bis die Länge 10 zeichen beträgt.
Und dann noch die prüfziffer auf zwei Stellen schreiben:
Java:
String prüfziffer = (endergebnis < 10 ? "0" : "") + endergebnis;

Ansonsten ist der code so verwendbar.

Und den Block mit den ganzen Zwischenergebnissen würde ich eher als Schleife aufbauen, aber das ist nebensächlich. Der Code aus #16 funktioniert mit den Anpassungen einwandfrei.
 
Ihr mit Eurem BigInteger:
Java:
    public static String convertToIban(String bankCode, String accountNumber) {
        String paddedAccount = String.format("%10s", accountNumber).replace(' ', '0');
        String bban = bankCode + paddedAccount;
        String checksum = checksum(bban + "131400");
        return "DE" + checksum + bban;
    }

    private static String checksum(String string) {
        int checksum = 0;
        for (char digit : string.toCharArray()) {
            checksum = (10*checksum + Character.digit(digit, 10)) % 97;
        }
        return String.format("%02d", 98 - checksum);
    }

EDIT: dieser @kneitzel war mal wieder schneller dran...
 
Das Problem ist doch, dass alte Leute damit nicht mehr zurechtkommen. Früher konnten sie sich problemlos eine Kontonummer und Bankleitzahl merken. Heute müssen sie eine 18stellige Zahl + Länderkennung + aberwitzige Prüfsumme aufschreiben, und "am Schalter" gibt es auch keine Bedingung mehr. Für viele gerät damit die Welt aus den Fugen.

Andererseits... Mir ist's egal, solange es QR Codes gibt, die den ganzen Kram speichern. 😉

PS: mihe7, danke für deine vereinfachende Berechnung... kannte ich noch nicht.
 
Sorry, es gibt keine einfache Lösung von Kontonummer und Bankleitzahl auf die Iban zu schließen. Die Banken haben bei der Umstellung auch ihre Systematik der Kontonummer geändert. Die Commerzbank war da besonders kreativ.
Du hast nur die Möglichkeit dir einen Service der Bank zu suchen und dann mit restful oder soap dir die richtige IBAN ermitteln zu lassen.

Ich dachte das Thema wäre im Jahr 2014 bereits erledigt gewesen. Wieso kommst du im Jahr 2021 noch auf diese Thematik.
 
Wie ich schon sagte, es gibt Ausnahmefälle. Aufgrund des Links meines Vorgängers habe ich folgen Teil gelesen:

Wenige Ausnahmefälle​

Nicht unerwähnt bleiben soll an dieser Stelle, dass das oben beschriebene manuelle Verfahren in Einzelfällen nicht korrekt funktionieren könnte. Das liegt daran, dass es den Banken grundsätzlich freigestellt blieb, wie sie die alten Kontoinformationen in IBAN umwandeln. Zwar nutzen alle das beschriebene Verfahren, machen aber einige Ausnahmen. Die Ausnahmefälle bei deutschen Kreditinstituten sind auf weit mehr als hundert Seiten einzeln aufgeführt – keine wirklich spannende Lektüre! Glücklicherweise sind alle Kreditinstitute dazu verpflichtet, ihre Umwandlungsregeln zu veröffentlichen, weswegen unser Rechner die Umwandlung für jedes Institut korrekt durchführen kann.
 
Und dann gibt's da noch verschiedene IBAN-Formate ...
Die 22stelligen IBANs konnte ich lange Zeit nicht im Formular für Onlinebanking eingeben, da hier 27stellige IBANs üblich sind.
In der Schweiz sind 21 Stellen üblich.

Edit: nvm ... im Titel steht ja "Deutschland" ... hat sich damit wohl erledigt
 
Zuletzt bearbeitet:

Zurück
Oben