Międzynarodowy numer rachunku bankowego (ang. International Bank Account Number – IBAN) – międzynarodowy standard służący do identyfikowania rachunków płatniczych.
Standard został utworzony przez Europejski Komitet Standardów Bankowych (ang. European Committee for Bank Standardisation), po czym przyjęto go jako ISO 13616. Międzynarodowy numer rachunku bankowego składa się z dwuliterowego kodu kraju ISO 3166-1, po którym następują dwie cyfry sprawdzające (suma kontrolna), oraz do trzydziestu znaków alfanumerycznych (liter lub cyfr), które zawierają numer rozliczeniowy i numer rachunku, określanych razem jako BBAN (ang. Basic Bank Account Number – podstawowy numer rachunku bankowego). Decyzja o długości tego bloku należy do poszczególnych krajów, z tym, że dany kraj musi posiadać jedną, określoną długość. W BBAN musi się zawierać unikatowy kod identyfikujący bank, o określonej długości i określonym miejscu, w którym się on rozpoczyna. Jego pozycja i długość również zależy od danego kraju.
W transakcjach elektronicznych kod IBAN powinien być przechowywany w jednym ciągu, bez spacji, jednakże w przypadku dokumentów na papierze powinien być zapisywany w grupach po cztery znaki, przy czym ostatnia grupa może mieć ich mniejszą liczbę (ze względu na różną liczbę znaków w poszczególnych państwach).
Kod IBAN został utworzony, by wspomóc obsługę płatności w Unii Europejskiej. Klienci, zwłaszcza osoby fizyczne oraz małe i średnie przedsiębiorstwa, często napotykają na problemy związane z różnymi standardami bankowości na świecie. Podanie numeru konta odbiorcy w formacie IBAN oraz kodu BIC banku jest obowiązkowe podczas wysyłania poleceń przelewu typu SEPA (w euro do państw Europejskiego Obszaru Gospodarczego oraz Islandii, Norwegii i Szwajcarii).
Kraje IBAN (stan na luty 2024)
Lista krajów i terytoriów zależnych, w których banki stosują numerację rachunków w standardzie IBAN.
W kolumnie Długość podano liczbę znaków, z których składa się cały IBAN (wraz z kodem kraju), nie wliczając w to odstępów rozdzielających bloki znaków. Oznaczenia w kolumnie Format: N – cyfra, A – litera, X – znak (litera lub cyfra).
| Kod | Państwo | Długość | Format | Uwagi |
|---|---|---|---|---|
| AD | Andora | 24 | ADNN NNNN NNNN XXXX XXXX XXXX | SEPA |
| AE | Zjednoczone Emiraty Arabskie | 23 | AENN NNNN NNNN NNNN NNNN NNN | |
| AL | Albania | 28 | ALNN NNNN NNNN XXXX XXXX XXXX XXXX | |
| AT | Austria | 20 | ATNN NNNN NNNN NNNN NNNN | SEPA |
| AZ | Azerbejdżan | 28 | AZNN AAAA XXXX XXXX XXXX XXXX XXXX | |
| BA | Bośnia i Hercegowina | 20 | BANN NNNN NNNN NNNN NNNN | |
| BE | Belgia | 16 | BENN NNNN NNNN NNNN | SEPA |
| BG | Bułgaria | 22 | BGNN AAAA NNNN NNXX XXXX XX | SEPA |
| BH | Bahrajn | 22 | BHNN AAAA XXXX XXXX XXXX XX | |
| BI | Burundi | 27 | BINN NNNN NNNN NNNN NNNN NNNN NNN | |
| BR | Brazylia | 29 | BRNN NNNN NNNN NNNN NNNN NNNN NNNA X | |
| BY | Białoruś | 28 | BYNN XXXX NNNN XXXX XXXX XXXX XXXX | |
| CH | Szwajcaria | 21 | CHNN NNNN NXXX XXXX XXXX X | SEPA |
| CR | Kostaryka | 22 | CRNN NNNN NNNN NNNN NNNN NN | |
| CY | Cypr | 28 | CYNN NNNN NNNN XXXX XXXX XXXX XXXX | SEPA |
| CZ | Czechy | 24 | CZNN NNNN NNNN NNNN NNNN NNNN | SEPA |
| DE | Niemcy | 22 | DENN NNNN NNNN NNNN NNNN NN | SEPA |
| DJ | Dżibuti | 27 | DJNN NNNN NNNN NNNN NNNN NNNN NNN | |
| DK | Dania | 18 | DKNN NNNN NNNN NNNN NN | SEPA |
| DO | Dominikana | 28 | DONN XXXX NNNN NNNN NNNN NNNN NNNN | |
| EE | Estonia | 20 | EENN NNNN NNNN NNNN NNNN | SEPA |
| EG | Egipt | 29 | EGNN NNNN NNNN NNNN NNNN NNNN NNNN N | |
| ES | Hiszpania | 24 | ESNN NNNN NNNN NNNN NNNN NNNN | SEPA |
| FI | Finlandia | 18 | FINN NNNN NNNN NNNN NN | SEPA |
| Wyspy Alandzkie | SEPA | |||
| FK | Falklandy | 18 | FKNN AANN NNNN NNNN NN | |
| FO | Wyspy Owcze | 18 | FONN NNNN NNNN NNNN NN | |
| FR | Francja | 27 | FRNN NNNN NNNN NNXX XXXX XXXX XNN | SEPA |
| Francuskie Terytoria Południowe i Antarktyczne | ||||
| Gujana Francuska | SEPA | |||
| Gwadelupa | SEPA | |||
| Majotta | SEPA | |||
| Martynika | SEPA | |||
| Nowa Kaledonia | ||||
| Polinezja Francuska | ||||
| Reunion | SEPA | |||
| Saint-Barthélemy | SEPA | |||
| Saint-Martin | SEPA | |||
| Saint-Pierre i Miquelon | SEPA | |||
| Wallis i Futuna | ||||
| GB | Guernsey | 22 | GBNN AAAA NNNN NNNN NNNN NN | |
| Jersey | ||||
| Wielka Brytania | SEPA | |||
| Wyspa Man | ||||
| GE | Gruzja | 22 | GENN AANN NNNN NNNN NNNN NN | |
| GI | Gibraltar | 23 | GINN AAAA XXXX XXXX XXXX XXX | SEPA |
| GL | Grenlandia | 18 | GLNN NNNN NNNN NNNN NN | |
| GR | Grecja | 27 | GRNN NNNN NNNX XXXX XXXX XXXX XXX | SEPA |
| GT | Gwatemala | 28 | GTNN XXXX XXXX XXXX XXXX XXXX XXXX | |
| HR | Chorwacja | 21 | HRNN NNNN NNNN NNNN NNNN N | SEPA |
| HU | Węgry | 28 | HUNN NNNN NNNN NNNN NNNN NNNN NNNN | SEPA |
| IE | Irlandia | 22 | IENN AAAA NNNN NNNN NNNN NN | SEPA |
| IL | Izrael | 23 | ILNN NNNN NNNN NNNN NNNN NNN | |
| IQ | Irak | 23 | IQNN AAAA NNNN NNNN NNNN NNN | |
| IS | Islandia | 26 | ISNN NNNN NNNN NNNN NNNN NNNN NN | SEPA |
| IT | Włochy | 27 | ITNN ANNN NNNN NNNX XXXX XXXX XXX | SEPA |
| JO | Jordania | 30 | JONN AAAA NNNN XXXX XXXX XXXX XXXX XX | |
| KW | Kuwejt | 30 | KWNN AAAA XXXX XXXX XXXX XXXX XXXX XX | |
| KZ | Kazachstan | 20 | KZNN NNNX XXXX XXXX XXXX | |
| LB | Liban | 28 | LBNN NNNN XXXX XXXX XXXX XXXX XXXX | |
| LC | Saint Lucia | 32 | LCNN AAAA XXXX XXXX XXXX XXXX XXXX XXXX | |
| LI | Liechtenstein | 21 | LINN NNNN NXXX XXXX XXXX X | SEPA |
| LT | Litwa | 20 | LTNN NNNN NNNN NNNN NNNN | SEPA |
| LU | Luksemburg | 20 | LUNN NNNX XXXX XXXX XXXX | SEPA |
| LV | Łotwa | 21 | LVNN AAAA XXXX XXXX XXXX X | SEPA |
| LY | Libia | 25 | LYNN NNNN NNNN NNNN NNNN NNNN N | |
| MC | Monako | 27 | MCNN NNNN NNNN NNXX XXXX XXXX XNN | SEPA |
| MD | Mołdawia | 24 | MDNN XXXX XXXX XXXX XXXX XXXX | |
| ME | Czarnogóra | 22 | MENN NNNN NNNN NNNN NNNN NN | |
| MK | Macedonia Północna | 19 | MKNN NNNX XXXX XXXX XNN | |
| MN | Mongolia | 20 | MNNN NNNN NNNN NNNN NNNN | |
| MR | Mauretania | 27 | MR13 NNNN NNNN NNNN NNNN NNNN NNN | |
| MT | Malta | 31 | MTNN AAAA NNNN NXXX XXXX XXXX XXXX XXX | SEPA |
| MU | Mauritius | 30 | MUNN AAAA NNNN NNNN NNNN NNNN NNNA AA | |
| NI | Nikaragua | 28 | NINN AAAA NNNN NNNN NNNN NNNN NNNN | |
| NL | Holandia | 18 | NLNN AAAA NNNN NNNN NN | SEPA |
| NO | Norwegia | 15 | NONN NNNN NNNN NNN | SEPA |
| OM | Oman | 23 | OMNN NNNX XXXX XXXX XXXX XXX | |
| PK | Pakistan | 24 | PKNN AAAA XXXX XXXX XXXX XXXX | |
| PL | Polska | 28 | PLNN NNNN NNNN NNNN NNNN NNNN NNNN | SEPA |
| PS | Palestyna | 29 | PSNN AAAA XXXX XXXX XXXX XXXX XXXX X | |
| PT | Portugalia | 25 | PT50 NNNN NNNN NNNN NNNN NNNN N | SEPA |
| QA | Katar | 29 | QANN AAAA XXXX XXXX XXXX XXXX XXXX X | |
| RO | Rumunia | 24 | RONN AAAA XXXX XXXX XXXX XXXX | SEPA |
| RS | Serbia | 22 | RSNN NNNN NNNN NNNN NNNN NN | |
| RU | Rosja | 33 | RUNN NNNN NNNN NNNN NNXX XXXX XXXX XXXX X | |
| SA | Arabia Saudyjska | 24 | SANN NNXX XXXX XXXX XXXX XXXX | |
| SC | Seszele | 31 | SCNN AAAA NNNN NNNN NNNN NNNN NNNN AAA | |
| SD | Sudan | 18 | SDNN NNNN NNNN NNNN NN | |
| SE | Szwecja | 24 | SENN NNNN NNNN NNNN NNNN NNNN | SEPA |
| SI | Słowenia | 19 | SINN NNNN NNNN NNNN NNN | SEPA |
| SK | Słowacja | 24 | SKNN NNNN NNNN NNNN NNNN NNNN | SEPA |
| SM | San Marino | 27 | SMNN ANNN NNNN NNNX XXXX XXXX XXX | SEPA |
| SO | Somalia | 23 | SONN NNNN NNNN NNNN NNNN NNN | |
| ST | Wyspy Świętego Tomasza i Książęca | 25 | STNN NNNN NNNN NNNN NNNN NNNN N | |
| SV | Salwador | 28 | SVNN AAAA NNNN NNNN NNNN NNNN NNNN | |
| TL | Timor Wschodni | 23 | TLNN NNNN NNNN NNNN NNNN NNN | |
| TN | Tunezja | 24 | TN59 NNNN NNNN NNNN NNNN NNNN | |
| TR | Turcja | 26 | TRNN NNNN NNXX XXXX XXXX XXXX XX | |
| UA | Ukraina | 29 | UANN NNNN NNXX XXXX XXXX XXXX XXXX X | |
| VA | Watykan | 22 | VANN NNNN NNNN NNNN NNNN NN | SEPA |
| VG | Brytyjskie Wyspy Dziewicze | 24 | VGNN AAAA NNNN NNNN NNNN NNNN | |
| XK | Kosowo | 20 | XKNN NNNN NNNN NNNN NNNN |
Przykłady
- Austria – ATkk BBBB BCCC CCCC CCCC
- B = kod banku, C = numer konta
- Belgia – BEkk CCCC CCCC CCKK
- 10 cyfr (C) reprezentuje bank i numer konta.
- Czechy - CZkk BBBB CCCC CCCC CCCC CCCC
kk = suma kontrolna; B = kod banku; C = numer konta
- Dania – DKkk CCCC CCCC CCCC CC
- Ostatnie 14 cyfr reprezentuje bank i numer konta.
- Francja – FRkk BBBB BGGG GGCC CCCC CCCC CKK
- Pierwsze 5 znaków to numer banku, kolejne 5 to numer agencji, kolejne 11 to numer konta, a 2 ostatnie to znaki kontrolne wyliczone z poprzedzających 21.
- Niemcy – DEkk BBBB BBBB CCCC CCCC CC
- Pierwsze 8 cyfr to identyfikator banku, ostatnie 10 to numer konta.
- Irlandia – IEkk AAAA BBBB BBCC CCCC CC
- Pierwsze 4 znaki alfanumeryczne to początek kodu SWIFT. Następnie sześciocyfrowy kod banku i 8 cyfr numeru rachunku. Uwaga: niektóre banki w Irlandii w ośmiocyfrowym numerze konta stosują litery.
- Włochy – ITkk BBBB BBBB BBBX XXXX XXXX XXX
- Pierwsze 11 cyfr to numer banku, ostatnie 12 jest numerem konta.
- Holandia – NLkk BBBB CCCC CCCC CC
- Pierwsze 4 znaki alfanumeryczne to symbol banku, kolejne 10 cyfr to numer rachunku.
- Polska – PLkk BBBB BBBB MMMM MMMM MMMM MMMM
- Pierwsze 2 cyfry to cyfry kontrolne. Następnych 8 cyfr to identyfikator banku-oddziału (z czego jego ostatnia, ósma cyfra jest cyfrą kontrolną, wyliczoną z pozostałych siedmiu). Ostatnie 16 to numer rachunku.
- Portugalia – PT50 BBBB BBBB CCCC CCCC CCCK K
- Pierwsze 2 cyfry to cyfry kontrolne - zawsze 50. Następnych 8 cyfr to identyfikator banku-oddziału. Następne 11 to numer rachunku, a następne 2 cyfry to liczba kontrolna dla cyfr od piątej do dwudziestej trzeciej wyliczona zgodnie z algorytmem MOD 97,10 wg ISO-7064.
- Rumunia – ROkk BBBB CCCC CCCC CCCC CCCC
- Pierwsze 4 znaki to numer banku, ostatnie 16 reprezentują oddział banku oraz numer rachunku, utworzone w zależności od banku (zwykle pierwsze 4 z szesnastu to numer oddziału). Niektóre banki zawierają identyfikator waluty ISO 4217 w numerze rachunku.
- Hiszpania – ESkk BBBB GGGG KKCC CCCC CCCC
- Wielka Brytania – GBkk BBBB SSSS SSCC CCCC CC
- Czterocyfrowy identyfikator banku, następnie kod oddziału (zwykle) i numer rachunku.
Sprawdzanie i wyliczanie cyfr kontrolnych
Algorytm sprawdzania cyfr kontrolnych:
- Weź pełny numer konta (razem z kodem kraju), bez spacji.
- Sprawdź, czy zgadza się długość numeru dla danego kraju.
- Przenieś 4 pierwsze znaki numeru na jego koniec.
- Przekształć litery w numerze konta na ciągi cyfr, zamieniając 'A' na '10', 'B' na '11' itd., aż do 'Z' na '35' (dla Polski 2521).
- Potraktuj otrzymany ciąg znaków jak liczbę i wylicz resztę z dzielenia przez 97.
- Jeśli reszta jest równa 1, to numer konta ma prawidłowe cyfry kontrolne.
Program w języku Python sprawdzający poprawność numeru IBAN, podanego jako pierwszy argument (dla kodów polskich i niemieckich sprawdza długość kodu):
#!/usr/bin/env python
# -*- coding: utf-8 -*
import sys
_lengths = { 'pl': 28, 'de': 22 } # tu można rozszerzyć o pozostałe kraje
def _norm_char(c):
if c.isalpha():
return str(ord(c.lower()) - ord('a') + 10)
else:
return c
def check_iban(num):
if not num.isalnum():
return False, 'Numer może zawierać tylko znaki alfanumeryczne.'
prefix = num[:2].lower()
if not prefix.isalpha():
return False, 'Numer nie zaczyna się od kodu kraju.'
expected_length = _lengths.get(prefix)
l = len(num)
# dla nieobsługiwanych krajów nie sprawdzamy długości
if (expected_length is not None) and (l != expected_length):
return False, 'Nieprawidłowa długość kodu ({} znak{} zamiast {}).'.format(len(num), ('' if l == 1 else 'i' if (1 < l % 10 < 5) and not (10 < l % 100 < 20) else 'ów'), expected_length)
i = int(''.join(_norm_char(j) for j in num[4:] + num[:4]))
if i % 97 != 1:
return False, 'Nieprawidłowa suma kontrolna.'
return True, None
num = sys.argv[1]
ok, msg = check_iban(num)
if ok:
print('Numer {} jest poprawnym numerem IBAN.'.format(num))
else:
print('Numer {} jest błędny. {}'.format(num, msg))
Funkcja w języku PL/SQL sprawdzająca poprawność cyfr kontrolnych dla polskiego numeru konta.
create or replace
FUNCTION udf_WyliczNRB(
v_bban IN VARCHAR2)
RETURN VARCHAR2
AS
in_v_bban VARCHAR2(100);
BEGIN
in_v_bban := v_bban;
in_v_bban := replace(REPLACE(in_v_bban, ' '), '-'); -- usunięcie spacji i myślników
IF LENGTH(in_v_bban) <> 28 THEN
RETURN 'Nieprawidłowy nr rachunku - zła długość';
END IF;
IF regexp_like(in_v_bban, '[A-Z]{2}\d{26}') THEN -- sprawdzenie formatu podanego numeru IBAN
IF mod(to_number(
substr(in_v_bban, 5, 24) ||
ascii(substr(in_v_bban, 1, 1)) - 55 ||
ascii(substr(in_v_bban, 2, 1)) - 55 ||
substr(in_v_bban, 3, 2)), 97) = 1 then
RETURN 'Cyfry kontrolne są poprawne';
else
RETURN 'Błędne cyfry kontrolne';
end if;
else
RETURN 'Nieprawidłowy nr rachunku - zły format';
END IF;
END;
Algorytm wyliczania cyfr kontrolnych:
- Stwórz numer konta składający się z kodu kraju, dwóch cyfr 0 a następnie numeru konta.
- Przenieś 4 pierwsze znaki numeru konta na jego koniec.
- Zamień litery w numerze konta na ciągi cyfry, zamieniając 'A' na '10', 'B' na '11' itd. aż do 'Z' na '35'.
- Potraktuj otrzymany ciąg znaków jak liczbę i wylicz resztę z dzielenia przez 97.
- Otrzymany wynik odejmij od 98, jeśli jest to liczba jednocyfrowa, dodaj na początku zero.
Funkcja w języku C# wyliczająca cyfry kontrolne dla polskiego numeru konta, podanego jako argument:
public static string WyliczNRB(string bban) {
if (string.IsNullOrEmpty(bban))
throw new ArgumentException("Nie podano numeru rachunku.");
bban = bban.Replace(" ", null); // usunięcie ewentualnych spacji
if (!Regex.IsMatch(bban, @"^\d{24}$"))
throw new ArgumentException("Podany numer rachunku jest nieprawidłowy.");
string nr2 = bban + "252100"; // A=10, B=11, ..., L=21, ..., P=25 oraz 2 zera
int modulo = 0;
foreach (char znak in nr2)
modulo = (10 * modulo + int.Parse(znak.ToString())) % 97;
modulo = 98 - modulo;
// zwrócenie w postaci czytelnej dla człowieka
return string.Format("{0:00} {1}", modulo, string.Join(" ",
Regex.Split(bban, "(....)(....)(....)(....)(....)(....)")).Trim());
}
Funkcja w języku Transact-SQL wyliczająca cyfry kontrolne dla polskiego numeru konta, podanego jako argument:
CREATE FUNCTION dbo.udf_WyliczNRB (@bban VARCHAR(32)) RETURNS VARCHAR(26) AS
BEGIN
SET @bban = REPLACE(@bban, ' ', '') -- usuniecie ewentualnych spacji
IF LEN(@bban) <> 24 RETURN 'Nieprawidlowy nr rachunku'
IF PATINDEX('%[^0123456789]%', @bban) <> 0 RETURN 'Nieprawidlowy nr rachunku'
DECLARE @bban2 DECIMAL(32,0)
SET @bban2 = CAST(@bban AS DECIMAL(32,0))*1000000 + 252100
RETURN right('00'+ CAST(98 - (@bban2 - FLOOR(@bban2 / 97)*97) AS VARCHAR(2)),2) + @bban
END
i sposób skorzystania z niej:
SELECT dbo.udf_WyliczNRB('114020040000123456789012');
20114020040000123456789012
Przypisy
- ↑ Słownik ekonomiczny, Narodowy Bank Polski.
- ↑ Official IBAN Registry at the Society for Worldwide Interbank Financial Telecommunication (SWIFT) (ang.)
- ↑ ISO 13616-1:2007 - Financial services - International bank account number (ang.)
- ↑ Patrz opis IBAN, strona informacyjna Irlandii. [dostęp 2010-09-16].