Pokud vaše aplikace pracuje s číslem bankovního účtu, je dobré ověřit, že je zadané hodnota formálně validní. Pravidla pro tvorbu čísel českých bankovních účtů stanoví vyhláška České národní banky číslo 169/2011 Sb.

Tato vyhláška určuje i IBAN formát českých čísel účtů. Pokud chcete validovat IBAN (nejenom pro české účty), použijte knihovnu IbanNet.

Číslo účtu sestává ze dvou nebo třech částí:

Zpravidla se zapisuje jako předčíslí-číslo/kód.

Pro základní validaci je tedy možné použít regulární výraz ^(\d{1,6}-)?\d{1,10}/\d{4}$. Tento výraz zkontroluje, zda číslo účtu neobsahuje nepovolené znaky a zda jednotlivé části jsou přítomny a mají správnou délku. Pomocí regulárního výrazu nicméně nelze spočítat kontrolní součet, který číslo účtu má.

Výpočet kontrolního součtu předčíslí a čísla účtu

Předčíslí a vlastní číslo účtu musí být (každé zvlášť) vytvořeno tak, aby splňovalo níže popsanou validační podmínku. Cílem je, aby bylo možné jednoduše odhalit překlep v zadání.

Algoritmus pro výpočet je následující:

Zapsán v jazyce C# vypadá tento algoritmus takto:

bool ValidatePart(string part) {
    if (string.IsNullOrEmpty(part)) return true;

    var chs = 0;
    for (var i = 0; i < part.Length; i++) {
        var num = int.Parse(part.Substring(i, 1));
        var weight = (int)Math.Pow(2, part.Length - i - 1) % 11;
        chs += num * weight;
    }
    return chs % 11 == 0;
}

Kontrola kódu banky (kódu platebního styku)

Tato část čísla účtu nemá žádný kontrolní algoritmus, ale je dána seznamem, který vydává a zveřejňuje Česká národní banka na svém webu.

Validační atribut

Do své knihovny Altairis Validation Toolkit jsem přidal nový atribut [CzechBankAccount] (zdrojový kód), který validaci provádí.

Ve výchozím nastavení validuje i kód banky, přičemž seznam kódů je napevno zadán ve zdrojovém kódu a když ČNB vydá novou verzi seznamu, bude nutné vydat novou verzi knihovny. Sáhl jsem k tomuto řešení, protože vlastní číselné kódy se příliš nemění. V seznamu se mění názvy subjektů a další údaje, ale vlastní seznam kódů je poměrně stabilní.

Validaci kódu platebního styku lze vypnout použitím [CzechBankAccount(IgnoreBankCode = true)]. V takovém případě projde jakákoliv čtyřmístná numerická hodnota.

Zdrojové kódy Altairis Validation Toolkitu si můžete stáhnout na GitHubu, knihovna je k dispozici jako NuGet balíček Altairis.ValidationToolkit.