венгерская валидация BBAN

кто-нибудь может сказать мне, как проверить номера венгерских счетов BBAN? в Интернете я нашел только то, что это 24 числа в длину и в формате

bbbs sssk cccc cccc cccc cccx
b = National bank code
s = Branch code
c = Account number
x = National check digit

но как рассчитать x = национальную контрольную цифру? Я пытался удалить последний символ и остаток по модулю на 97, но это не работает (результат не 1 для действительных номеров учетных записей)

Заранее благодарю за любую помощь


person jan    schedule 27.10.2016    source источник
comment
возможно, вам придется связаться с Венгерской банковской ассоциацией, так как алгоритм расчета контрольной цифры, которую вы ищете, зависит от страны, и они являются наиболее компетентной организацией, которая может дать вам рекомендации по этому вопросу. их контактную информацию можно найти здесь.   -  person holex    schedule 27.10.2016


Ответы (1)


Я только что закончил проверку венгерской учетной записи. Это первая версия этой функции, но она работает хорошо.

public string sprawdzWegierskitempAccountNumber(string _accountNumberToCheck, bool _iban) //if iban is true then function result will be always IBAN (even if _accountNumberToCheck will be BBAN) { string _accountNumberCorrected = _accountNumberToCheck.Replace(" ", ""); _accountNumberCorrected = _accountNumberCorrected.Replace("-", ""); _accountNumberCorrected = _accountNumberCorrected.Replace("//", ""); _accountNumberCorrected = _accountNumberCorrected.Replace("\", ""); string _accountNumberCorrectedFirst = _accountNumberCorrected; if (_accountNumberCorrected.Length == 16 || _accountNumberCorrected.Length == 24 || _accountNumberCorrected.Length == 28) {

        if (_accountNumberCorrected.Length == 28) //IBAN Account number
        {
            _accountNumberCorrected = _accountNumberCorrected.Substring(4, _accountNumberCorrected.Length - 4); //we don't need first four digits (HUxx)
        }

        string digitToMultiply = "9731";
        int checkResult = 0;

        //checking first part of account number
        for (int i = 0; i <= 6; i++)
        {
            checkResult = checkResult + int.Parse(_accountNumberCorrected.ToCharArray()[i].ToString()) * int.Parse(digitToMultiply.ToCharArray()[i % 4].ToString());
        }
        checkResult = checkResult % 10;
        checkResult = 10 - checkResult;
        if (checkResult == 10)
        {
            checkResult = 0;
        }
        if (checkResult.ToString() != _accountNumberCorrected.ToCharArray()[7].ToString())
        {
            throw new Exception("Wrong account number");
        }
        else
        {
            //if first part it's ok then checking second part of account number
            checkResult = 0;
            for (int i = 8; i <= _accountNumberCorrected.Length-2; i++)
            {
                checkResult = checkResult + int.Parse(_accountNumberCorrected.ToCharArray()[i].ToString()) * int.Parse(digitToMultiply.ToCharArray()[i % 4].ToString());
            }

            checkResult = checkResult % 10;
            checkResult = 10 - checkResult;
            if (checkResult == 10)
            {
                checkResult = 0;
            }
            if (checkResult.ToString() != _accountNumberCorrected.ToCharArray()[_accountNumberCorrected.Length-1].ToString())
            {
                throw new Exception("Wrong account number");
            }

        }

        string tempAccountNumber = _accountNumberCorrected + "173000";

        var db = 0; var iban = 0;
        var maradek = 0;
        string resz = "", ibanstr = "", result = "";

        while (true)
        {

            if (db == 0)
            {
                resz = tempAccountNumber.Substring(0, 9);
                tempAccountNumber = tempAccountNumber.Substring(9, (tempAccountNumber.Length - 9));

            }

            else
            {

                resz = maradek.ToString();
                resz = resz + tempAccountNumber.Substring(0, (9 - db));
                tempAccountNumber = tempAccountNumber.Substring((9 - db), (tempAccountNumber.Length - 9 + db));

            }

            maradek = int.Parse(resz) % 97;

            if (maradek == 0)
                db = 0;
            else
                if (maradek < 10)
                    db = 1;
                else
                    db = 2;

            if ((tempAccountNumber.Length + db) <= 9)
                break;
        }

        if (maradek != 0)
        {
            resz = maradek.ToString();
            resz = resz + tempAccountNumber;
        }
        else
            resz = tempAccountNumber;

        maradek = int.Parse(resz) % 97; ;
        iban = 98 - maradek;
        if (iban < 10)
            ibanstr = "0" + iban.ToString();
        else ibanstr = iban.ToString();

        if (_accountNumberCorrected.Length == 16)
        {
            _accountNumberCorrected = _accountNumberCorrected + "00000000";
            _accountNumberCorrectedFirst = _accountNumberCorrectedFirst + "00000000";
        }

        if (_iban)
        {
            result = "HU" + ibanstr + _accountNumberCorrected;
        }
        else
        {
            result = _accountNumberCorrectedFirst;
        }

        return result;
    }
    else
    {
        throw new Exception("Wrong length of account number");
    }
}

person eMSoja    schedule 12.12.2016