iOS 信用卡/银联卡校验-Luhn算法

一、Kuhn算法
    检验数字算法(Luhn Check Digit Algorithm),也叫做模数10公式,是一种简单的算法,用于验证银行卡、信用卡号码的有效性的算法。对所有大型信用卡公司发行的信用卡都起作用,这些公司包括美国Express、护照、万事达卡、Discover和用餐者俱乐部等。这种算法最初是在20世纪60年代由一组数学家制定,现在Luhn检验数字算法属于大众,任何人都可以使用它。
 
二、校验过程:
    1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
    2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
    3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
 
例如:卡号为4514617608810943
    1) 奇数位和:3+9+1+8+6+1+4+5 = 37
    2) 偶数位和:4*2+0*2+(8*2-9)+0*2+(7*2-9)+(6*2-9)+1*2+4*2 = 33
    3) 余数为0则是银行卡:(37+33)/10 = 0
 
另外:
  1、卡号位数少于14的基本是外资银行或小银行
  2、卡号位数多余23的大多是卡号包含字母或空格
  3、国内主流的银行(中、农、工、建、招、交等)基本都是基于16位或者19位的卡号
 
不符合Luhn算法的银行卡:
    1、招商银行的运通卡
    2、江苏银行有些卡号不符合
    
 注意:
  并非所有信用卡银行卡都符合Luhn算法、所以即使用户填写的卡号违反了该规则,我们应该仍然运行用户的填写,但可以给出相应的警示内容,提示用户可能填错了
 
OC实现 
-(BOOL)checkCardNumber:(NSString *)cardNumber{   // 4514617608810943
    int sum = 0;
    NSUInteger cardNumLength = [cardNumber length];
    int i = 0;
    
    while (i < cardNumLength) {
        NSString *subStr = [cardNumber substringWithRange:NSMakeRange(cardNumLength - 1 - i, 1)];
        int subInt = [subStr intValue];
        if (i % 2 != 0) {
            subInt *= 2;
            if(subInt > 9) {
                subInt -= 9;
            }
        }
        sum += subInt;
        i++;
    }
    
    if((sum % 10) == 0) {
        return YES;
    } else {
        return NO;
    }
}
 
 
原文地址:https://www.cnblogs.com/10-19-92/p/6762655.html