International Bank Account Number

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

International Bank Account Number, IBAN (międzynarodowy numer rachunku bankowego) – międzynarodowy standard numeracji kont bankowych.

Standard został utworzony przez Europejski Komitet Standardów Bankowych (European Committee for Bank Standardisation), po czym przyjęto go jako ISO 13616. IBAN 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 krajach).

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 firmy, 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 krajów Europejskiego Obszaru Gospodarczego i Szwajcarii).

Kraje IBAN, stan na styczeń 2014[edytuj | edytuj kod]

Lista krajów i terytoriów zależnych, w których banki stosują numerację rachunków w standardzie IBAN[1][2].

W kolumnie Długość podano liczbę znaków, z których składa się cały numer 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 Kraj Długość Format Uwagi
AD  Andora 24 ADNN NNNN NNNN XXXX XXXX XXXX
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
BR  Brazylia 29 BRNN NNNN NNNN NNNN NNNN NNNN NNNA X
CH  Szwajcaria 21 CHNN NNNN NXXX XXXX XXXX X SEPA
CR  Kostaryka 21 CRNN NNNN NNNN NNNN NNNN N
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
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
ES  Hiszpania 24 ESNN NNNN NNNN NNNN NNNN NNNN SEPA
FI  Finlandia 18 FINN NNNN NNNN NNNN NN SEPA
 Wyspy Alandzkie SEPA
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
FO  Wyspy Owcze 18 FONN NNNN NNNN NNNN NN
GB  Wielka Brytania 22 GBNN AAAA NNNN NNNN NNNN NN 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
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 AANN 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
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
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 19 MKNN NNNX XXXX XXXX XNN
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
NL  Holandia 18 NLNN AAAA NNNN NNNN NN SEPA
NO  Norwegia 15 NONN NNNN NNNN NNN SEPA
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
SA  Arabia Saudyjska 24 SANN NNXX XXXX XXXX XXXX XXXX
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
TN  Tunezja 24 TN59 NNNN NNNN NNNN NNNN NNNN
TR  Turcja 26 TRNN NNNN NXXX XXXX XXXX XXXX XX
VG  Brytyjskie Wyspy Dziewicze 24 VGNN AAAA 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.
  • 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[3].
  • Włochy – ITkk BBBB BBBB BBBX XXXX XXXX XXX
Pierwsze 11 cyfr to numer banku, ostatnie 12 jest numerem konta.
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.
  • 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.
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, u'Numer może zawierać tylko znaki alfanumeryczne'
 
  prefix = num[:2].lower()
  if not prefix.isalpha():
    return False, u'Numer nie zaczyna się od kodu kraju'
  expexted_length = _lengths.get(prefix) 
  # dla nieobsługiwanych krajów nie sprawdzamy długości
  if expexted_length is not None:
    if len(num) != expexted_length:
      return False, u'Nieprawidłowa długość kodu (%d znaki zamiast %d)' % (len(num), expexted_length)
 
  i = int(''.join(map(_norm_char, num[4:] + num[:4])))
  if i % 97 != 1:
    return False, u'Nieprawidłowa suma kontrolna'
  return True, None
 
num = sys.argv[1]
ok, msg = check_iban(num)
if ok:
  print u'Numer %s jest poprawnym numerem IBAN' % num
else:
  print u'Numer %s jest błędny: %s' % (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

Zobacz też[edytuj | edytuj kod]

Przypisy

Linki zewnętrzne[edytuj | edytuj kod]