Nedávno jsem zjistil, že číslo českého bankovního účtu musí splňovat kontrolní součet definovaný ČNB.
Nenašel jsem na internetu žádný kód v C# tak jsem se rozhodl napsat svůj vlastní ve formě extension metody.
public static class StringExtensions { private static Regex CzBankAccountRegex = new Regex(@"((\d{0,6})-)?(\d{1,10})/(\d{4})"); public static bool IsValidCzBankAccount(this string bankAccountInput) { if (bankAccountInput == null) return false; Match match = CzBankAccountRegex.Match(bankAccountInput); if (!match.Success) return false; string acc1 = match.Groups[2].Value; string acc2 = match.Groups[3].Value; string bankCode = match.Groups[4].Value; if (string.IsNullOrEmpty(acc1)) return CzBankAccountControlSum(acc2) && CzBankCodes.Contains(bankCode); return CzBankAccountControlSum(acc1) && CzBankAccountControlSum(acc2) && CzBankCodes.Contains(bankCode); } private static readonly int[] CzBankAccountWeights = new int[] { 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 }; private static bool CzBankAccountControlSum(string accountNumberStr) { string padded = accountNumberStr.PadLeft(10, '0'); int sum = 0; for (int i = 0; i < padded.Length; i++) sum += int.Parse(padded[i].ToString()) * CzBankAccountWeights[i]; return sum % 11 == 0; } private static readonly HashSet<string> CzBankCodes = new HashSet<string>() { "0100", "0300","0600","0710","0800","2010","2060","2070","2100","2200", "2220","2250","2260","2275","2600","2700","3030","3050","3060","3500", "4000","4300","5500","5800","6000","6100","6200","6210","6300","6700", "6800","7910","7950","7960","7970","7990","8030","8040","8060","8090", "8150","8190","8198","8199","8200","8220","8230","8240","8250","8255", "8265","8270","8280","8293","8299","8500" }; }