Непосредственная проблема в вашем коде - ваш цикл for
. i+2
не является надлежащим третьим термином. Из контекста вы ищете i = i + 2
, который вы можете написать сокращенно, как i += 2
.
Кажется, ваш алгоритм «возьмите 16 цифр, превратите их в 8 пар, добавьте их вместе и посмотрите, делится ли сумма на 10». Если это так, вы можете значительно упростить свой цикл - вам никогда не нужно смотреть на десятки мест, просто на место.
Ваш цикл может выглядеть и делать то же самое:
for (i = 1; i < 16; i +=2) {
numSum += +creditNum[i];
}
Кроме того, обратите внимание, что до тех пор, как вы имеете дело со строкой, вам не нужно резать что-либо вообще - просто используйте обозначения массива для получения каждого символа.
Я добавил +
перед creditNum
. Одна из проблем с javascript заключается в том, что он будет обрабатывать строку как строку, поэтому, если у вас есть строка «1» и строка «3» и добавьте их, вы будете конкатенации и получите «13» вместо 4. Знак плюса заставляет строку быть числом, поэтому вы получите правильный результат.
Третий член цикла - единственная вопиющая ошибка, которую я вижу. Я действительно не знаю алгоритм Луна, поэтому вывел остальные из контекста вашего кода.
EDIT
Ну, это помогло бы, если бы ты писал, что Luhn algorithm есть. Скорее всего, если вы можете хотя бы сформулировать это, вы можете помочь нам помочь вам его кодировать.
Вот что вы хотите.
// Luhn check
function luhnCheck(sixteenDigitString) {
var numSum = 0;
var value;
for (var i = 0; i < 16; ++i) {
if (i % 2 == 0) {
value = 2 * sixteenDigitString[i];
if (value >= 10) {
value = (Math.floor(value/10) + value % 10);
}
} else {
value = +sixteenDigitString[i];
}
numSum += value;
}
return (numSum % 10 == 0);
}
alert(luhnCheck("4111111111111111"));
Что это делает пройти через все числа, сохраняя даже показатели, как они есть, но в два раза нечетные. Если удвоение более девяти, значения двух цифр складываются вместе, согласно алгоритму, указанному в википедии.
FIDDLE
Примечание: номер я тестировал с не мой номер кредитной карты, но это хорошо известный номер, который вы можете использовать это, как известно, проходит должным образом закодированный проверки Luhn.
Возможный дубликат [Проверка кредитной карты с помощью регулярного выражения с использованием теста()] (http://stackoverflow.com/questions/4912094/credit-card-validation-with-regexp-using-test) –