首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于如何用Javascript编码Luhn信用卡验证的建议?

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

Stack Overflow用户
提问于 2013-10-08 13:49:48
回答 3查看 4.1K关注 0票数 1

我对Javascript非常糟糕,因为我刚刚开始学习。我在查一张16位数的信用卡。这让我发疯了,如果有人能帮我看看,我会很感激的。

代码语言: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>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-08 14:01:32

代码中最直接的问题是for循环。i+2不是一个合适的第三届任期。从上下文中,您正在寻找i = i + 2,您可以以i += 2的形式编写它。

看起来你的算法是“取16位数字,把它们转换成8对,加在一起,看看和是否可以被10整除”。如果是这样的话,你可以大大简化你的循环--你永远不需要看十元的位置,仅仅是单位的位置。

您的循环可以像这样做同样的事情:

代码语言:javascript
复制
for (i = 1; i < 16; i +=2) {
    numSum += +creditNum[i];
}

另外,请注意,只要处理字符串,就不需要分割任何东西--只需使用数组表示法来获取每个字符。

我在+前面添加了一个creditNum。javascript的一个问题是,它将字符串视为字符串,因此,如果您有字符串"1“和字符串"3”并将它们相加,您将连接起来,得到"13“而不是4。加号强制字符串是一个数字,因此您将得到正确的结果。

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

编辑

好吧,如果你发布了Luhn算法是什么会有帮助的。机会是,如果你至少能表达出来,你可以帮助我们帮助你编码它。

这是你想要的。

代码语言:javascript
复制
// 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,按照维基百科中的算法,两位数的值相加在一起。

小提琴

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

票数 0
EN

Stack Overflow用户

发布于 2019-02-04 05:22:11

我下面的解决方案也将在AmEx上工作。不久前我提交了一份代码测试报告。希望它有帮助:)

代码语言:javascript
复制
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的米奇

票数 0
EN

Stack Overflow用户

发布于 2021-06-23 20:36:00

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19249554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档