проверка карты JS без преобразования в строку или массив - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь создать валидатор cs50 с помощью JavaScript. У меня проблемы с подсчетом контрольной суммы. Это должно быть sum % 10 === 0 //true.

let cards = [378282246310005, 371449635398431,
        5555555555554444, 5105105105105100, 4012888888881881,
        4012888888881880, 1234567890, 361049635398431], result = '';

cards.forEach( card => {
    if (isCardValid(card)) {
        result += card + ' = ';
        checkBank(card);
    }
});

document.getElementById('task6').innerHTML = result;

function checkBank(card) {
    if ((card >= 340000000000000 && card < 350000000000000) || (card >= 370000000000000 && card < 380000000000000))
        result += ("AMEX\n");
    else if (card >= 5100000000000000 && card < 5600000000000000)
        result += ("MASTERCARD\n");
    else if ((card >= 4000000000000 && card < 5000000000000) || (card >= 4000000000000000 && card < 5000000000000000))
        result += ("VISA\n");
    else
        result += ("INVALID\n");
}

function isCardValid(digits) {
    let sum = 0;

    for (let i = 0; i < digits.length; i++) {
        let cardNum = parseInt(digits[i]);

        if ((digits.length - i) % 2 === 0) {
            cardNum = cardNum * 2;

            if (cardNum > 9) {
                cardNum = cardNum - 9;
            }
        }

        sum += cardNum;
    }

    return sum % 10 === 0;
}

Вот некоторые данные для проверки работы валидатора:

  • 378282246310005 //AMEX
  • 371449635398431 //AMEX
  • 5555555555554444 //MASTERCARD
  • 5105105105105100 //MASTERCARD
  • 4012888888881881 //VISA
  • 4012888888881880 //INVALID
  • 1234567890 //INVALID
  • 361049635398431 //INVALID

Главное, я не могу использовать строки, массивы и любые готовые к использованию функции. Жду вашей помощи, спасибо.

UPD Я решил проблему с помощью алгоритма, за исключением этой карты:

  • 4012888888881880 //INVALID

Мой код считает, что это карта VISA. Проверка банка выглядит хорошо, поэтому я не знаю, где найти проблему. Любые предложения, где проблема?

UPD2 Финальная версия

let cards = [378282246310005, 371449635398431,
        5555555555554444, 5105105105105100, 4012888888881881,
        4012888888881880, 1234567890, 361049635398431], result = '';

cards.forEach( card => {
    if (isCardValid(card)) {
        result += card + ' = ';
        checkBank(card);
    } else {
        result += card + ' = INVALID Card\n'
    }
});

document.getElementById('task6').innerHTML = result;

function checkBank(card) {
    if ((card >= 340000000000000 && card < 350000000000000) || (card >= 370000000000000 && card < 380000000000000))
        result += ("AMEX\n");
    else if (card >= 5100000000000000 && card < 5600000000000000)
        result += ("MASTERCARD\n");
    else if ((card >= 4000000000000 && card < 5000000000000) || (card >= 4000000000000000 && card < 5000000000000000))
        result += ("VISA\n");
    else
        result += ("INVALID Bank\n");
}

function isCardValid(card) {
    let sum = 0, len, first = 0, second = 0;

    for (len=0; card; Math.floor(card /= 10), ++len) {
        let digit = Math.floor(card % 10);
        second = first;
        first = digit;

        if (len & 1) {
            digit += digit;
            if (digit > 9) {
                digit -= 9;
            }
        }
        sum += digit;
    }

    return sum % 10 === 0;
}
...