提问者:小点点

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


正如标题所说,我正在尝试用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个答案

匿名用户

让我们用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>