Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用JavaScript实现Luhn算法_Javascript_Luhn - Fatal编程技术网

用JavaScript实现Luhn算法

用JavaScript实现Luhn算法,javascript,luhn,Javascript,Luhn,我正在尝试将一个Luhm算法实现移植到JavaScript中,这是用C#实现的。我把它移植过来了,我以为它能用,但我无法得到合法的卡来验证。我的美国运通可以验证罚款,但我的两个签证拒绝这样做。代码如下: luhn = function (number) { var _deltas = [0, 1, 2, 3, 4, -4, -3, -2, -1, 0], _checksum = 0, _digits = [], i, j;

我正在尝试将一个Luhm算法实现移植到JavaScript中,这是用C#实现的。我把它移植过来了,我以为它能用,但我无法得到合法的卡来验证。我的美国运通可以验证罚款,但我的两个签证拒绝这样做。代码如下:

luhn = function (number) {
    var _deltas = [0, 1, 2, 3, 4, -4, -3, -2, -1, 0],
        _checksum = 0,
        _digits = [],
        i,
        j;

    while (number != 0) {
        _digits.push(parseInt((number % 10), 10));

        number = parseInt((number / 10), 10);
    }

    for (i = (_digits.length - 1), j = _digits.length; i > -1; i--) {
        _digit = _digits[i];
        _checksum += _digit;
        _checksum += ((((i - j) % 2) === 0) ? _deltas[_digit] : 0);
    }

    return ((_checksum % 10) === 0);
};
有人能告诉我哪里不对吗?我原以为这在C版本中效果不错,但现在我有点怀疑。。。提前谢谢


  <script>
      // takes the form field value and returns true on valid number
    function valid_credit_card(value) {
      // accept only digits, dashes or spaces
        if (/[^0-9-\s]+/.test(value)) return false;

        // The Luhn Algorithm. It's so pretty.
        var nCheck = 0, nDigit = 0, bEven = false;
        value = value.replace(/\D/g, "");

        for (var n = value.length - 1; n >= 0; n--) {
            var cDigit = value.charAt(n),
                  nDigit = parseInt(cDigit, 10);

            if (bEven) {
                if ((nDigit *= 2) > 9) nDigit -= 9;
            }

            nCheck += nDigit;
            bEven = !bEven;
        }

        return (nCheck % 10) == 0;
    }

    console.log(valid_credit_card("5610591081018250"),"valid_credit_card Validation");
  </script>
//接受表单字段值,并在有效数字上返回true 功能有效的信用卡(值){ //仅接受数字、破折号或空格 如果(/[^0-9-\s]+/.test(value))返回false; //卢恩算法,非常漂亮。 var nCheck=0,nDigit=0,bEven=false; 值=值。替换(/\D/g,“”); 对于(var n=value.length-1;n>=0;n--){ var cDigit=值。字符(n), nDigit=parseInt(cDigit,10); 如果(贝文){ 如果((nDigit*=2)>9)nDigit-=9; } nCheck+=nDigit; 贝文=!贝文; } 返回值(n检查%10)=0; } 控制台日志(有效的信用卡(“5610591081018250”),“有效的信用卡验证”);
这里的最佳解决方案

所有测试用例都按照

这归功于


对于其他人来说,下面是我提交的测试解决方案:)

函数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))此解决方案接受数组作为参数。如果其valid返回true,如果其invalid返回false

function validateCred(arr) {
    let sumArray = [];
    let numHolder = null;
    let everySecondNumber = 1;
    for (let i = arr.length - 1; i >= 0; i--) {
        if (everySecondNumber % 2 === 0) {
                numHolder = arr[i] * 2;
            if (numHolder > 9) {
                numHolder -= 9;
            }
        } else {
            numHolder = arr[i];
        }
        sumArray.push(numHolder);
        everySecondNumber++;
    }
    totalSum = sumArray.reduce((acc,val) => acc + val, 0);
    if (totalSum % 10 == 0) {
        return true;
    } else {
        return false;
    }
}

提示:
alert(parseInt(“545111875046384725”,10))
和。这适用于此处的示例:但可能不适用于较大的数字。