Przejdź do głównej zawartości

NRB

NRB (Numer Rachunku Bankowego) to polski krajowy format numeru rachunku bankowego. Składa się z 26 cyfr: 2-cyfrowej sumy kontrolnej MOD-97, 8-cyfrowego numeru rozliczeniowego banku oraz 16-cyfrowego numeru rachunku. Międzynarodowy format IBAN to prefiks PL poprzedzający 26-cyfrowy NRB.

use SlashLab\Numerik\Numerik;
// Walidacja logiczna
Numerik::nrb()->isValid('61102010260000000000000000'); // true
// Format ze spacjami jest akceptowany i normalizowany
Numerik::nrb()->isValid('61 1020 1026 0000 0000 0000 0000'); // true
// Format IBAN (prefiks PL) jest akceptowany i usuwany podczas normalizacji
Numerik::nrb()->isValid('PL61102010260000000000000000'); // true
Numerik::nrb()->isValid('PL61 1020 1026 0000 0000 0000 0000'); // true
// Szczegółowy wynik
$result = Numerik::nrb()->validate('61102010260000000000000000');
$result->isValid; // true
// Parsowanie do obiektu wartości
$nrb = Numerik::nrb()->parse('61102010260000000000000000');
// null zamiast wyjątku w przypadku błędu
$nrb = Numerik::nrb()->tryParse('błędny-numer'); // null

parse() i tryParse() zwracają instancję SlashLab\Numerik\ValueObjects\Nrb.

MetodaTyp zwracanyOpis
getRaw()stringOryginalny numer bez zmian.
getNormalized()string26 cyfr bez prefiksu i spacji.
__toString()stringIdentyczne z getNormalized().
MetodaTyp zwracanyOpis
getFormatted()stringStandardowy polski format wyświetlania: CC BBBB BBBB AAAA AAAA AAAA AAAA.
getIban()stringPełny numer IBAN: PL + 26 cyfr, np. PL61102010260000000000000000.
getFormattedIban()stringIBAN w grupach: PL61 1020 1026 0000 0000 0000 0000.
MetodaTyp zwracanyOpis
getCheckDigits()stringPierwsze 2 cyfry — wartość kontrolna MOD-97.
getSortCode()string8-cyfrowy numer rozliczeniowy banku (identyfikator banku + oddziału + cyfra kontrolna).
getBankCode()stringPierwsze 3 cyfry numeru rozliczeniowego — identyfikator banku.
getAccountNumber()stringOstatnie 16 cyfr — numer rachunku klienta.
$nrb = Numerik::nrb()->parse('61102010260000000000000000');
$nrb->getRaw(); // '61102010260000000000000000'
$nrb->getNormalized(); // '61102010260000000000000000'
$nrb->getFormatted(); // '61 1020 1026 0000 0000 0000 0000'
$nrb->getIban(); // 'PL61102010260000000000000000'
$nrb->getFormattedIban(); // 'PL61 1020 1026 0000 0000 0000 0000'
$nrb->getCheckDigits(); // '61'
$nrb->getSortCode(); // '10201026'
$nrb->getBankCode(); // '102'
$nrb->getAccountNumber(); // '0000000000000000'
// Wszystkie formaty wejściowe są równoważne
$a = Numerik::nrb()->parse('61102010260000000000000000');
$b = Numerik::nrb()->parse('61 1020 1026 0000 0000 0000 0000');
$c = Numerik::nrb()->parse('PL61102010260000000000000000');
$a->getNormalized() === $b->getNormalized(); // true
$b->getNormalized() === $c->getNormalized(); // true

NRB używa standardowej sumy kontrolnej IBAN MOD-97:

  1. Usuń spacje i myślniki. Usuń opcjonalny prefiks PL. Odrzuć wejścia dłuższe niż 40 znaków.
  2. Wymagaj dokładnie 26 cyfr — inaczej błąd InvalidLength.
  3. Wymagaj, aby wszystkie znaki były cyframi — inaczej błąd InvalidCharacters.
  4. Zweryfikuj sumę kontrolną MOD-97:
    • Przestaw kolejność: cyfry 3–26 (BBAN) + 2521 (kodowanie numeryczne PL) + cyfry 1–2 (cyfry kontrolne).
    • Oblicz resztę z dzielenia powstałej liczby przez 97.
    • Jeśli wynik nie wynosi 1, zwróć błąd InvalidChecksum.
PrzyczynaWartośćKiedy
InvalidLengthinvalid_lengthPo normalizacji nie ma dokładnie 26 cyfr lub surowa wartość przekracza 40 znaków.
InvalidCharactersinvalid_charactersPo usunięciu spacji, myślników i prefiksu PL pozostają znaki niebędące cyframi.
InvalidChecksuminvalid_checksumReszta z MOD-97 nie wynosi 1.
If this saved you time → ☕ Buy me a coffee