2013-10-08 4 views
1

Я довольно ужасен в Javascript, так как я только начал учиться. Я делаю проверку Luhn для 16-значной кредитной карты. Это сводит меня с ума, и я был бы рад, если бы кто-то посмотрел на него и помог мне.Консультации о том, как закодировать проверку кредитной карты Luhn с помощью Javascript?

<script> 
var creditNum; 
var valid = new Boolean(true); 

creditNum = prompt("Enter your credit card number: "); 

if((creditNum==null)||(creditNum=="")){ 
    valid = false; 
    alert("Invalid Number!\nThere was no input."); 
}else if(creditNum.length!=16){ 
    valid = false; 
    alert("Invalid Number!\nThe number is the wrong length."); 
} 
//Luhn check 
var c; 
var digitOne; 
var digitTwo; 
var numSum; 
for(i=0;i<16;i+2){ 
    c = creditNum.slice(i,i+1); 
    if(c.length==2){ 
     digitOne = c.slice(0,1); 
     digitTwo = c.slice(1,2); 
     numSum = numSum + (digitOne + digitTwo); 
    }else{ 
     numSum = numSum + c; 
    } 
} 
if((numSum%10)!=0){ 
    alert("Invalid Number!"); 
}else{ 
    alert("Credit Card Accepted!"); 
} 
</script> 
+0

Возможный дубликат [Проверка кредитной карты с помощью регулярного выражения с использованием теста()] (http://stackoverflow.com/questions/4912094/credit-card-validation-with-regexp-using-test) –

ответ

0

Непосредственная проблема в вашем коде - ваш цикл 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.

+0

Не работает для Amex Карта! – Unbreakable

+0

OP относится к 16-значным кредитным картам. AmEx - 15 цифр. Вам, очевидно, нужно будет изменить цикл 'for'. –

+0

ya вы правы. Я не заметил должным образом. – Unbreakable