[PHP] Jak sprawdzić czy numer rachunku bankowego (NRB) został wpisany poprawnie?
Chcesz sprawdzić czy użytkownik podał prawidłowy numer rachunku bankowego i nie popełnił w nim błędu.
Nie można sprawdzić czy podany numer rachunku istnieje w banku i korzysta z niego jakaś firma lub osoba. Można jednak łatwo sprawdzić czy cyfry w numerze zostały wpisane poprawnie i użytkownik nie popełnił podczas wpisywania NRB błędu. Ma to kluczowe znaczenie gdy w formularzu internetowym klient podaje numer rachunku.
Numer rachunku składa się z 26 cyfr, z których dwie pierwsze zawierają cyfrę kontrolną, osiem kolejnych zawiera numer jednostki organizacyjnej banku, a 24 ostatnie numer porządkowy rachunku w tym banku. Cały numer wygląda np. tak:
07 10901 0790 4173 3822 600 0401
Aby sprawdzić czy numer został poprawnie wpisany, należy go uzupełnić o dodatkowy kod kraju, a cyfry przemnożyć przez odpowiednie wagi i całość podzielić modulo. Zobacz jak przeprowadzić wszystkie operacje krok po kroku.
Na początku do numeru rachunku trzeba dodać kod Polski (PL) i dwa zera. Oczywiście litery PL powinny zostać zamienione na kod cyfrowy 25 21. W sumie dodajemy sześć cyfr, zawsze takich samych: 252100.
Teraz mamy numer 32 cyfrowy. Na chwilę zapominamy o pierwszych dwóch cyfrach (07), które stanowią sumę kontrolną. Mamy więc numer składający się z 30 cyfr w postaci:
10901 0790 4173 3822 600 0401 252100
Każdą cyfrę należy teraz przemnożyć przez odpowiednią wagę, które wynoszą po kolei: 57, 93, 19, 31, 71, 75, 56, 25, 51, 73, 17, 89, 38, 62, 45, 53, 15, 50, 5, 49, 34, 81, 76, 27, 90, 9, 30, 3, 10, 1, a uzyskane wyniki dodać do siebie. Wygląda to mniej więcej tak: 1*57 + 0*93 + 9*19 + itd... = 3583.
Otrzymany wynik należy podzielić modulo 97 i odjąć od 98. Modulo to całkowita reszta z dzielenia przez 97. Suma kontrolna wynosi więc: 98 - 3583 mod 97 = 7. Jeżeli otrzymana liczba jest mniejsza niż 10 dodaje się zero wiodące z przodu, a więc ostatecznie suma kontrolna to 07.
Faktycznie - przed numerem rachunku jest liczba 07, co oznacza, że wpisany numer jest poprawny i nie została zrobiona literówka lub nie pomyliliśmy liczb. Teraz zapiszmy to samo w postaci skryptu PHP:
<?
function nrb($nrb) {
$nrb=preg_replace("/[^0-9]/","",$nrb);
if (strlen($nrb)<>26) return 0;
$nrb .="252100";
$wagi = array(57,93,19,31,71,75,56,25,51,73,17,89,38,62,45,
53,15,50,5,49,34,81,76,27,90,9,30,3,10,1);
for ($i=0; $i<30;$i++) $suma += $nrb[$i+2]*$wagi[$i];
$liczba = sprintf("%02d", 98 - $suma%97);
if ($nrb[0]==$liczba[0] and $nrb[1]==$liczba[1]) return 1;
return 0;
}
$numer="07109010790417338226000401";
if (nrb($numer)) echo "NRB poprawny";
else echo "NRB błędny";
?>
Do funkcji nrb() przekazujemy numer, który może być zapisany ze spacjami lub łącznikami albo jednym ciągiem. Wyrażenie regularne zostawi w zmiennej $nrb tylko same cyfry. Powinno ich być 26.
Dodajemy do ciągu oznaczenie kraju i dwa zera, czyli "252100". Następnie sumujemy 30 cyfr mnożąc je przez wagi, omijając dwie pierwsze cyfry, z którymi będziemy potem porównywać wynik.
Funkcja sprintf() uzupełnia wynik do dwóch pozycji, gdy wynik wyjdzie mniejszy niż 10. W funkcji tej odejmujemy od 98 sumę podzieloną modulo przez 97.
Pozostało tylko porównać czy liczby z wyniku odpowiadają pierwszym cyfrom z rachunku. Jeżeli tak, można zwrócić 1, co sprawi, że warunek będzie prawdziwy i potwierdzi poprawnie wpisany NRB.