Międzynarodowy numer rachunku bankowego
Międzynarodowy numer rachunku bankowego (ang. International Bank Account Number – IBAN) – międzynarodowy standard służący do identyfikowania rachunków płatniczych[1].
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)
[edytuj | edytuj kod]Lista krajów i terytoriów zależnych, w których banki stosują numerację rachunków w standardzie IBAN[2][3].
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
[edytuj | edytuj kod]- 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[4].
- 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
[edytuj | edytuj kod]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
[edytuj | edytuj kod]- ↑ 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].