International Bank Account Number

Z Wikipedii, wolnej encyklopedii
(Przekierowano z IBAN)
Skocz do: nawigacji, szukaj

International Bank Account Number (IBAN, pol. 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), i do trzydziestu znaków alfanumerycznych (liter lub cyfr) określających numer rachunku, określanych jako BBAN (ang. Basic Bank Account Number, pol. 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.

Kraje Europy, a także azjatyckie na Bliskim Wschodzie, które (na 28 kwietnia 2011 r.) wdrożyły standard IBAN[1] przy nadawaniu numerów kont bankowych[2] wymienione w kolejności alfabetycznej:

Andora, Albania, Arabia Saudyjska, Austria, Belgia, Bośnia i Hercegowina, Bułgaria, Chorwacja, Cypr, Czarnogóra, Czechy, Dania, Estonia, Finlandia, Francja, Gibraltar, Grecja, Grenlandia, Gruzja, Hiszpania, Holandia, Irlandia, Islandia, Izrael, Kazachstan, Kuwejt, Liban, Liechtenstein, Litwa, Luksemburg, Łotwa, Macedonia, Malta, Mauretania, Mauritius, Monako, Niemcy, Norwegia, Polska, Portugalia, Rumunia, San Marino, Serbia, Słowacja, Słowenia, Szwajcaria, Szwecja, Tunezja, Turcja, Węgry, Wielka Brytania, Włochy, Wyspy Owcze, Zjednoczone Emiraty Arabskie. System nie obowiązuje na Białorusi, Mołdawii, Rosji i Ukrainie.

Spis treści

[edytuj] Przykłady

  • Austria (20) IBAN format: 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.

[edytuj] Sprawdzanie i wyliczanie cyfr kontrolnych

Algorytm sprawdzania cyfr kontrolnych:

  • Weź pełen 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.
  • Zamień 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, ' '), '-'); -- usuniecie spacji i myślników
  IF LENGTH(in_v_bban) <> 28 THEN
     RETURN 'Nieprawidlowy nr rachunku - zła dugość';
  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 'Nieprawidlowy 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

[edytuj] Zobacz też

Przypisy

[edytuj] Linki zewnętrzne

Osobiste
Przestrzenie nazw

Warianty
Działania
Nawigacja
Dla czytelników
Dla wikipedystów
Narzędzia
Drukuj lub eksportuj
W innych językach