有关如何使用Javascript对Luhn信用卡验证进行编码的建议?

时间:2013-10-08 13:49:49

标签: javascript validation luhn

我刚刚开始学习,我对Javascript非常糟糕。 我正在检查一张16位数的信用卡。 它让我疯了,如果有人看过它并且可以给我一些帮助,我会很感激。

<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>

3 个答案:

答案 0 :(得分: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。加号强制字符串为数字,这样你就可以得到正确的结果。

循环的第三个术语是我看到的唯一明显的错误。我实际上并不知道Luhn算法,因此从代码的上下文中推断出其余部分。

修改

好吧,如果您发布了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"));

这样做是通过所有数字,保持偶数指数不变,但加倍奇数。如果加倍超过9,则根据维基百科中所述的算法将两个数字的值相加。

FIDDLE

注意:我测试的号码不是我的信用卡号码,但是您可以使用众所周知的号码来传递正确编码的Luhn验证。

答案 1 :(得分:0)

我下面的解决方案也可以在AmEx上使用。我前一段时间提交了它进行代码测试。希望对您有所帮助:)

function validateCard(num){
    var oddSum = 0;
    var evenSum = 0;
    var numToString = num.toString().split("");
    for(var i = 0; i < numToString.length; i++){
      if(i % 2 === 0){
        if(numToString[i] * 2 >= 10){
          evenSum += ((numToString[i] * 2) - 9 );
        } else {
          evenSum += numToString[i] * 2;
        }
      } else {
        oddSum += parseInt(numToString[i]);
      }
    }
    return (oddSum + evenSum) % 10 === 0;
  }
console.log(validateCard(41111111111111111));

享受-https://spangle.com.au的Mitch

答案 2 :(得分:0)

@Spangle,当你在这里使用偶数和奇数时,你已经在考虑索引 0 是偶数了吗?因此,您将索引 0、2 等处的数字加倍,而不是将第二个位置、第四个等处的数字加倍。这是故意的吗?与我正在使用的另一种算法相比,它返回​​的某些卡片的验证不一致。试试例如美国运通的 378282246310005。