11

在用户点击提交之前,是否有人有一个库或 JavaScript 片段来验证信用卡的校验位?

4

6 回答 6

19

jQuery 验证插件有一个验证信用卡号码的方法。

还有其他特定的脚本:

他们中的大多数使用Luhn 算法

于 2008-11-01T03:52:49.287 回答
10

可能 OP 甚至不再关注这个线程,但这可能对其他人有帮助:

http://jquerycreditcardvalidator.com

它检查卡片类型,验证其长度并使用 Luhn 算法检查 mod 10。

于 2013-12-21T02:54:05.053 回答
7

您可以使用此代码段通过Luhn 算法验证 16 位卡号:

function validateCardNumber(number) {
    var regex = new RegExp("^[0-9]{16}$");
    if (!regex.test(number))
        return false;

    return luhnCheck(number);
}

function luhnCheck(val) {
    var sum = 0;
    for (var i = 0; i < val.length; i++) {
        var intVal = parseInt(val.substr(i, 1));
        if (i % 2 == 0) {
            intVal *= 2;
            if (intVal > 9) {
                intVal = 1 + (intVal % 10);
            }
        }
        sum += intVal;
    }
    return (sum % 10) == 0;
}
于 2014-04-22T14:34:10.540 回答
3

Luhn 算法(也称为Luhn 公式)可用于验证各种识别号(例如信用卡号IMEI)。

我省略了算法的解释,因为它已经被其他人公开了,但如果你需要最快的 Javascript 实现,你可以在这里看到它。

简单地说 ...

function luhn(array) {
  return function (number) {
    let len = number ? number.length : 0,
      bit = 1,
      sum = 0;

    while (len--) {
      sum += !(bit ^= 1) ? parseInt(number[len], 10) : array[number[len]];
    }
    return sum % 10 === 0 && sum > 0;
  };
}([0, 2, 4, 6, 8, 1, 3, 5, 7, 9]);

请注意,链接源代码采用ES6语言(也称为 JavaScript 2015),但在ES5中进行了转译(参见index.js),并且经过了全面的单元测试。

此外,它可以在浏览器和/或node.js中使用。

在jsperf上进行基准测试和其他实现,以验证其高性能。

现在,如果您只是想使用它,请从链接存储库中获取代码。

否则通过凉亭安装它...

bower install luhn-alg

或者通过npm ...

npm install luhn-alg

免责声明:我是luhn-alg包的作者。

于 2015-06-16T12:48:21.390 回答
1

如果您还没有使用 jQuery 插件,您可以使用此功能。它基于 Luhn 算法,可以容忍空格或破折号,因此应该适用于您需要它的大多数数据输入案例。

http://af-design.com/blog/2010/08/18/validating-credit-card-numbers/

于 2010-08-18T16:33:17.813 回答
1

Luhn 公式是信用卡验证中最流行的算法。不要害怕algorithm你正在寻找图书馆的词。这非常容易理解。根据维基百科的描述,这个算法可以分为 3 个步骤:

  • 从最右边的数字(即校验位)开始,向左移动,每第二位的值加倍;如果这个加倍运算的乘积大于 9(例如,8 × 2 = 16),则将乘积的数字相加(例如,16: 1 + 6 = 7, 18: 1 + 8 = 9)。
  • 取所有数字的总和。
  • 如果总模 10 等于 0(如果总和以 0 结尾),则根据 Luhn 公式,该数是有效的;否则无效。

这是我的工作草稿。

function luhn(anum){
    anum = anum+'';
    var sum = 0,
        max = anum.length - 1;
    //From the rightmost digit, which is the check digit, moving left
    for(var j=max;j>=0;j--){
        var digit = parseInt(anum[j]);
        //Take the sum of all the digits
        if((max - j) & 1){
            //double the value of every second digit
            var add = digit * 2;
            //if the product of this doubling operation is greater than 9 ,
            //then sum the digits of the products
            sum += add < 10 ? add : 1 + add % 10;
        }else{
            sum += digit;
        }
    }
    //If the total modulo 10 is equal to 0 (if the total ends in zero)
    //then the number is valid according to the Luhn formula;else it is not valid.
    return sum % 10 === 0;
}

luhn(79927398713) -> true
于 2015-01-26T10:08:51.793 回答