# Iban & Bic



## takidoso (17. November 2006)

Hallo und Halli,
Mal ne Frage gibt es jemanden, der sich mit IBAN und BIC auseinandergesetzt hat? 
BZW: gibt es zufällig schon sowas wie open-Source Bibliothek(en) zum formalen validieren von IBANs und BICs (mittels Prüfziffer).
Leider habe ich noch keine wirklich verlässliche Quelle wie die Prüfziffer berechtnet wird finden können, also mi rwürde da notfalls auch eine gute Seite als Link weiterhelfen, die mir da zuverlässig und eindeutig Auskunft gibt.

mit bestem Dank im Voraus

Takidoso


----------



## benni0307 (8. Februar 2008)

hey suche das gleiche, hast du schon eine lösung? 
wie heisst die seite die mir den iban generiert?
lg benni

srry das i da net weiterhelfn konnte


----------



## takidoso (8. Februar 2008)

Grüß Dich,
ja da habe ich sogar was, aber da ich zur Ziet im Urlaub bin und erst wieder am Montag den 25.2. zurück im Büro sein werde musst Du leider doch noch ein ewnig Geduld haben, pardon.
Du kannst aber mal nach dem Opfen-Source Swift Parser googeln, da müsste irgendwo in deren Forum ein Thread sein, wo ich glaube ich auch den Algorythmus in einer Beispielimplementation hinterlassen habe.

gib mir am dann einfach bescheid wenn Du fündig oder nicht fündig geworden bist. Ich werde auf jedefall diesen Trehad mit der Beispielimplementierung beglücken und dann als fertig markieren, wenn ich wieder im Büro bin, versprochen.

Takidoso


----------



## benni0307 (13. Februar 2008)

hey danke,
hab leider im google nichts gefunden....
aber freu mich schon auf die implementierung....
viel spass im urlaub


----------



## Thomas Darimont (13. Februar 2008)

Hallo,

schau mal hier:
https://java-swift.dev.java.net/
http://wife.sourceforge.net/

Gruß Tom


----------



## takidoso (25. Februar 2008)

so hier der versprochene Soruce-Code zum Prüfen von IBANs mittels der Prüfziffer


```
import java.math.BigInteger;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * Serviceroutinen um Banknummer wie z.B. IBAN zu checken.
 *
 */
public class BankingNumberValidation
{
    final static private Set ISO_COUNTRY_CODES = new HashSet();


    final static public int NOT_AN_IBAN          = 0;
    final static public int BAD_IBAN_CHECKNUM    = 1;
    final static public int GOOD_IBAN            = 2;
    final static public int EU_IBAN              = 3;

    final static public int NOT_A_BIC           = 0;
    final static public int GOOD_BIC            = 1;
    final static public int EU_BIC              = 2;


    final static private BigInteger BIG_INT_97 = new BigInteger("97");
    final static private BigInteger BIG_INT_1  = new BigInteger("1");
    final static private Pattern    IBAN_PAT   = Pattern.compile(("([A-Z]{2})([0-9]{2})([\\w]{1,30})"));

    static
    {
        String[] cCodes = Locale.getISOCountries();

        for (int i=0; i<cCodes.length; i++)
        {
            ISO_COUNTRY_CODES.add(cCodes[i]);
        }
    }

    /**
     * checks if the given IBAN seems to be an iban (without countrycode-check)
     * and validates the checknumber
     * this routine is a bit cheap but also fast since no country-codes are checked
     *
     * @param iban
     * @return (int) NOT_AN_IBAN       , if given String does not matche basic IBAN-format
     *               BAD_IBAN_CHECKNUM , if basic IBAN-format is OK but not the checknumber
     *               GOOD_IBAN         , if basic IBAN-format and hecknumber are OK
     */
    static public int isIBANCheckNumberOK(String iban)
    {
        int rc;
        Matcher matcher = IBAN_PAT.matcher(iban);

        if (matcher.matches())
        {
            StringBuffer ibanBuff  = new StringBuffer(34);
            StringBuffer valueBuff = new StringBuffer(34);

            ibanBuff.append(matcher.group(3));
            ibanBuff.append(matcher.group(1));
            ibanBuff.append(matcher.group(2));

            for(int i=0; i<ibanBuff.length(); i++)
            {
                int  v;
                char c =ibanBuff.charAt(i);
                if ((c>='A' && c<='Z'))
                {
                    v = c - 'A' + 10;
                    valueBuff.append(v);
                }
                else if ((c>='a' && c<='z'))
                {
                    v = c - 'a' + 10;
                    valueBuff.append(v);
                }
                else
                {
                    valueBuff.append(c);
                }

            }

            BigInteger val = new BigInteger(valueBuff.toString());

            rc = val.divideAndRemainder(BIG_INT_97)[1].equals(BIG_INT_1)? GOOD_IBAN : BAD_IBAN_CHECKNUM;

        }
        else
        {
            rc = NOT_AN_IBAN;
        }

        return rc;
    }


    /**
     * checks if the given IBAN seems to be an iban with countrycode-check
     * and validates the checknumber
     * if this validation is allright it is checked whether the country-code is
     * sorts to european regulations payment area or not
     *
     * the higher the returned value the better the IBAN so if you just want to know
     * if the IBAN is allright but don't care about the european-area you just
     * do something like this:
     *  <code>
     *      if (BankingNumberValidation.isIBAN(iban) >= GOOD_IBAN)
     *      {
     *              ... do something
     *      }
     *  </code>
     *
     * @param iban
     * @return (int) NOT_AN_IBAN       , if given String does not matche basic IBAN-format or countrycod is unkown
     *               BAD_IBAN_CHECKNUM , if basic IBAN-format and countrycode are OK but not the checknumber
     *               GOOD_IBAN         , if basic IBAN-format, countrycode and checknumber are OK
     *               EU_IBAN           , if basic IBAN-format, countrycode, checknumber are OK and the countrycode is european
     *
     * @see de.cmk.util.banking.EUCountryCodes.isIbanEUCountry
     */
    static public int isIBAN(String iban)
    {
        int rc;
        Matcher matcher = IBAN_PAT.matcher(iban);

        if (matcher.matches() && ISO_COUNTRY_CODES.contains(iban.substring(0,2)))
        {
            StringBuffer ibanBuff  = new StringBuffer(34);
            StringBuffer valueBuff = new StringBuffer(34);

            ibanBuff.append(matcher.group(3));
            ibanBuff.append(matcher.group(1));
            ibanBuff.append(matcher.group(2));

            for(int i=0; i<ibanBuff.length(); i++)
            {
                int  v;
                char c =ibanBuff.charAt(i);
                if ((c>='A' && c<='Z'))
                {
                    v = c - 'A' + 10;
                    valueBuff.append(v);
                }
                else if ((c>='a' && c<='z'))
                {
                    v = c - 'a' + 10;
                    valueBuff.append(v);
                }
                else
                {
                    valueBuff.append(c);
                }

            }

            BigInteger val = new BigInteger(valueBuff.toString());

            if (val.divideAndRemainder(BIG_INT_97)[1].equals(BIG_INT_1))
            {
                if (EUCountryCodes.isIbanEUCountry(iban))
                {
                    rc = EU_IBAN;
                }
                else
                {
                    rc = GOOD_IBAN;
                }
            }
            else
            {
                rc = BAD_IBAN_CHECKNUM;
            }

        }
        else
        {
            rc = NOT_AN_IBAN;
        }

        return rc;
    }


    /**
     * very simple formal check on given bic
     * cheks if the countrycode is correct or even european
     * assumes thta a bic is 11 or 8 characters long and
     * an that the 4. and 5. offset is the country-code
     * @param bic
     * @return
     */
    static public int isBIC(String bic)
    {
        int rc ;
        if (bic.length()==11 || bic.length()==8)
        {
            if (EUCountryCodes.isBicEUCountry(bic))
            {
                rc = EU_BIC;
            }
            else if  (ISO_COUNTRY_CODES.contains(bic))
            {
                rc = GOOD_BIC;
            }
            else
            {
                rc = NOT_A_BIC;
            }
        }
        else
        {
            rc = NOT_A_BIC;
        }

        return rc;
    }

    public static void main(String argv[])
    {
        System.out.println(argv[0]+" isBIC:"+ isBIC(argv[0]));

        System.out.println(argv[0]+" isIBAN:"+ isIBAN(argv[0]));
    }


}
```

hier noch die Auflistung der entsprechenden teilnehmenden Nationen


```
import java.util.HashSet;
import java.util.Set;


public class EUCountryCodes
{
    static private Set m_ibanCountryCodes = new HashSet();
    static private Set m_bicCountryCodes  = new HashSet();

    static
    {
        m_ibanCountryCodes.add("AT");
        m_ibanCountryCodes.add("BE");
        m_ibanCountryCodes.add("CY");
        m_ibanCountryCodes.add("CZ");
        m_ibanCountryCodes.add("DE");
        m_ibanCountryCodes.add("DK");
        m_ibanCountryCodes.add("EE");
        m_ibanCountryCodes.add("ES");
        m_ibanCountryCodes.add("FI");
        m_ibanCountryCodes.add("FR");
        m_ibanCountryCodes.add("GB");
        m_ibanCountryCodes.add("GI");
        m_ibanCountryCodes.add("GR");
        m_ibanCountryCodes.add("HU");
        m_ibanCountryCodes.add("IE");
        m_ibanCountryCodes.add("IS");
        m_ibanCountryCodes.add("IT");
        m_ibanCountryCodes.add("LI");
        m_ibanCountryCodes.add("LT");
        m_ibanCountryCodes.add("LU");
        m_ibanCountryCodes.add("LV");
        m_ibanCountryCodes.add("MT");
        m_ibanCountryCodes.add("NL");
        m_ibanCountryCodes.add("NO");
        m_ibanCountryCodes.add("PL");
        m_ibanCountryCodes.add("PT");
        m_ibanCountryCodes.add("SE");
        m_ibanCountryCodes.add("SI");
        m_ibanCountryCodes.add("SK");

        m_bicCountryCodes.add("AT");
        m_bicCountryCodes.add("BE");
        m_bicCountryCodes.add("CY");
        m_bicCountryCodes.add("CZ");
        m_bicCountryCodes.add("DE");
        m_bicCountryCodes.add("DK");
        m_bicCountryCodes.add("EE");
        m_bicCountryCodes.add("ES");
        m_bicCountryCodes.add("FI");
        m_bicCountryCodes.add("FR");
        m_bicCountryCodes.add("GB");
        m_bicCountryCodes.add("IE");
        m_bicCountryCodes.add("GF");
        m_bicCountryCodes.add("GI");
        m_bicCountryCodes.add("GP");
        m_bicCountryCodes.add("GR");
        m_bicCountryCodes.add("HU");
        m_bicCountryCodes.add("IE");
        m_bicCountryCodes.add("IS");
        m_bicCountryCodes.add("IT");
        m_bicCountryCodes.add("LI");
        m_bicCountryCodes.add("LT");
        m_bicCountryCodes.add("LU");
        m_bicCountryCodes.add("LV");
        m_bicCountryCodes.add("MQ");
        m_bicCountryCodes.add("MT");
        m_bicCountryCodes.add("NL");
        m_bicCountryCodes.add("NO");
        m_bicCountryCodes.add("PL");
        m_bicCountryCodes.add("PT");
        m_bicCountryCodes.add("RE");
        m_bicCountryCodes.add("SE");
        m_bicCountryCodes.add("SI");
        m_bicCountryCodes.add("SK");
    }




    static public boolean isBicEUCountry(String bic)
    {
        return m_bicCountryCodes.contains(bic.substring(4,6));
    }

    static public boolean isIbanEUCountry(String iban)
    {
        return m_ibanCountryCodes.contains(iban.substring(0,2));
    }
}
```

Die Seite woher ich den Algorythmus für IBAN habe scheint irgendwie nicht mehr da zu existieren wo einer meiner Favoriten hinzeigte :-(
aber heir habe ich eine andere Seite wo es offenbar erklärt wird
http://alexandrerodichevski.chiappani.it/doc.php?n=219&lang=en#algo
und hier:
http://www.europebanks.info/ibanguide.htm
und noch was 
http://www.skynet.ie/~martin/pages/iban.html


und hier der IBAN Link zum überprüfen einer IBAN
http://www.iban-rechner.de/index.php?id=1&L=0


----------

