关于如何使用Javascript编码Luhn信用卡验证的建议?

关于如何使用Javascript编码Luhn信用卡验证的建议?,javascript,validation,luhn,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

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

var-creditNum;
var valid=新布尔值(真);
creditNum=提示(“输入您的信用卡号:”);
if((creditNum==null)| |(creditNum==“”){
有效=错误;
警报(“无效号码!\n没有输入。”);
}else if(creditNum.length!=16){
有效=错误;
警报(“无效号码!\n号码长度错误。”);
}
//卢恩支票
var c;
洋地黄碱;
var digitTwo;
numSum变种;

for(i=0;i代码中的直接问题是你的
for
循环。
i+2
不是合适的第三个术语。从上下文来看,你正在寻找
i=i+2
,你可以简写为
i+=2

看起来你的算法是“把16位数字变成8对,加起来,看看总和是否能被10整除”。如果是这样的话,你可以大大简化你的循环——你不需要看十位数,只需要看单位的位置

您的循环可以如下所示,并执行相同的操作:

for (i = 1; i < 16; i +=2) {
    numSum += +creditNum[i];
}
这样做的目的是遍历所有数字,保持偶数索引不变,但将奇数索引加倍。如果加倍超过9,则按照维基百科中规定的算法,将两个数字的值相加


注意:我测试的号码不是我的信用卡号码,但它是一个众所周知的号码,您可以使用它通过正确编码的Luhn验证。

我下面的解决方案也适用于美国运通。我不久前提交了它进行代码测试。希望它能有所帮助:)

函数validateCard(num){
var oddSum=0;
var-evenSum=0;
var numToString=num.toString().split(“”);
对于(变量i=0;i=10){
evenSum+=((numToString[i]*2)-9);
}否则{
evenSum+=numToString[i]*2;
}
}否则{
oddSum+=parseInt(numToString[i]);
}
}
返回值(oddSum+evenSum)%10==0;
}
日志(validateCard(41111111));

享受-Mitch from

OP的可能副本指的是16位数的信用卡。美国运通是15位数。显然,您需要为
循环更改
// 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"));
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));