当前位置: 首页 > 知识库问答 >
问题:

我试图用Javascript实现Luhns算法,但我的编程一直在无限期地循环

邵飞鸿
2023-03-14

正如标题所说,我正在尝试用Javascript编写luhns算法,并让它打印出一个有效的卡号,以及它是什么类型的卡,无论是美国运通卡、万事达卡还是Visa卡。

运行时,它所做的只是连续循环警报框。我想让它打印的是这是一个有效的卡片类型和它是什么牌子的卡片在警告框。

null

function checkCreditCard() {
  var ccnum = document.getElementById("cardnum").value;
  var cardArray = [cardnum]
  var temp = ccnum;
  var checkerArray;
  if (cardType(ccnum) === "AmericanExpress") {
    checkerArray = [15];
    for (x = 0; x < 15; x++) {
      checkerArray[x] = ccnum % 10;
      ccnum = ccnum / 10;
    }
  } else {
    checkerArray = [16];
    for (x = 0; x < 16; x++) {
      checkerArray[x] = ccnum % 10;
      ccnum = ccnum / 10;
      if (ccnum == 0) {
        checkerArray[15] = -1;
        checkerArray[14] = -1;
        checkerArray[13] = -1;
      }
    }
  }
  var summing;
  for (x = 1; x < checkerArray.length; x = x + 2) {

    if (checkerArray[x] < 0) {
      return;
    }
    checkerArray[x] = checkerArray[x] * 2;
    if (checkerArray[x] >= 10) {
      summing = summing + checkerArray[x] % 10 + checkerArray[x] / 10
    } else {
      summing = summing + checkerArray[x];
    }
  }

  for (x = 0; x < checkerArray.length; x = x + 2) {

    if (checkerArray[x] < 0) {
      return;
    }
    summing = summing + checkerArray[x];

    if (summing == 20) {
      alert("This Card is Legit")
    } else {
      alert("This Card is Invalid")
    }
  }

  function cardType(ccnum) {

    var x = {
      Visa: /^4[0-9]{12}(?:[0-9]{3})?$/,
      Mastercard: /^5[1-5][0-9]{14}$/,
      AmericanExpress: /^3[47][0-9]{13}$/,
    }
    for (var l in x) {
      if (x[l].test(ccnum)) {
        return l;
      }
    }
    return null;
  }
}
<input type="text" id="cardnum" onkeyup="checkCreditCard()" />
<span id="valid">Enter a Number and Press Enter</span>

null

共有1个答案

宋飞文
2023-03-14

让我们用let

另外,让我们将警报移到循环之外

null

function cardType(ccnum) {

  var x = {
    Visa: /^4[0-9]{12}(?:[0-9]{3})?$/,
    Mastercard: /^5[1-5][0-9]{14}$/,
    AmericanExpress: /^3[47][0-9]{13}$/,
  }
  for (var l in x) {
    if (x[l].test(ccnum)) {
      return l;
    }
  }
  return null;
}

document.getElementById("cardForm").addEventListener("submit", function(e) {
  e.preventDefault();
  var ccnum = document.getElementById("cardnum").value;
  if (ccnum.length < 16) return
  var cardArray = [cardnum]
  var temp = ccnum;
  var checkerArray;
  if (cardType(ccnum) === "AmericanExpress") {
    checkerArray = [15];
    for (let x = 0; x < 15; x++) {
      checkerArray[x] = ccnum % 10;
      ccnum /= 10;
    }
  } else {
    checkerArray = [16];
    for (let x = 0; x < 16; x++) {
      checkerArray[x] = ccnum % 10;
      ccnum /= 10;
      if (ccnum == 0) {
        checkerArray[15] = -1;
        checkerArray[14] = -1;
        checkerArray[13] = -1;
      }
    }
  }
  var summing;
  for (let x = 1; x < checkerArray.length; x = x + 2) {
    checkerArray[x] *= 2;
    if (checkerArray[x] >= 10) {
      summing +=  checkerArray[x] % 10 + checkerArray[x] / 10
    } else {
      summing += checkerArray[x];
    }
  }

  for (let x = 0; x < checkerArray.length; x = x + 2) {
    summing += checkerArray[x];
  }
  if (summing == 20) {
    alert("This Card is Legit")
  } else {
    alert("This Card is Invalid")
  }

})
<form id="cardForm">
<input type="tel" id="cardnum" maxlength="16" />
<span id="valid">Enter a Number and Press Enter</span>
</form>
 类似资料:
  • 有许多有限状态机提出的问题,但都与我的问题无关。 我需要5种方法 我们从里面开始 我们想打印状态→ 0和输出0→ 读取输入首先在ebx中,第二个将在eax中 做完整的程序 这是我的代码:这里的问题是输入不起作用。如果我输入00,01,11-

  • 本文向大家介绍Android编程实现ListView内容无限循环显示的方法,包括了Android编程实现ListView内容无限循环显示的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android编程实现ListView内容无限循环显示的方法。分享给大家供大家参考,具体如下: 其实要达到无限循环显示,主要就是实现继承Adapter的类。 我这里用到的是BaseAdapter 在on

  • java.lang.IllegalAccessError:试图从类org.openqa.selenium.os.executableFinder访问类org.openqa.selenium.firefox.firefoxBinary

  • 我使用的是intellij和junit-jupiter-api-5.7.2和mockito-core-3.9.0。我使用了正确的RunWith注释,所有的公共测试都有@test。在SomeBusinessImpl中,方法都是公共的。我不明白为什么会发生org.mockito.exceptions.base.MockitoException错误。 下面是我要测试的类 如果有人能帮助我,真的很感激,谢

  • 本文向大家介绍Android Viewpager实现无限循环轮播图,包括了Android Viewpager实现无限循环轮播图的使用技巧和注意事项,需要的朋友参考一下 在网上找了很多viewpager实现图片轮播的,但是大多数通过以下方式在PagerAdapter的getCount()返回一个无限大的数,来实现 伪无限 虽然通过这种方式是能达到效果,但是从严格意义上来说并不是真正的无限。 假如有五

  • 这就是问题所在 HP@DESKTOP-1HP83V8 MINGW64~/Desktop/Web开发(主版)$npx创建反应应用程序我的应用程序 在C:\Users\HP\Desktop\Web Development\my app中创建新的React应用程序。 安装软件包。这可能需要几分钟 正在使用cra模板安装react、react dom和react脚本。。。 npm错误!我从没打过电话! N