</pre><p class="p1"><pre name="code" class="objc">// 银行卡校验
//通过Luhn算法来验证通过
//1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
//2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
//3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
+(BOOL)luhmCheck:(NSString*)teleStr{
if ([teleStr length] == 0) {
return NO;
}
NSString * lastNum = [[teleStr substringFromIndex:(teleStr.length-1)] copy];//取出最后一位
NSString * forwardNum = [[teleStr substringToIndex:(teleStr.length -1)] copy];//前15或18位
NSMutableArray * forwardArr = [[NSMutableArray alloc] initWithCapacity:0];
for (int i=0; i<forwardNum.length; i++) {
NSString * subStr = [forwardNum substringWithRange:NSMakeRange(i, 1)];
[forwardArr addObject:subStr];
}
NSMutableArray * forwardDescArr = [[NSMutableArray alloc] initWithCapacity:0];
for (int i =((int)forwardArr.count-1); i> -1; i--) {//前15位或者前18位倒序存进数组
[forwardDescArr addObject:forwardArr[i]];
}
NSMutableArray * arrOddNum = [[NSMutableArray alloc] initWithCapacity:0];//奇数位*2的积 < 9
NSMutableArray * arrOddNum2 = [[NSMutableArray alloc] initWithCapacity:0];//奇数位*2的积 > 9
NSMutableArray * arrEvenNum = [[NSMutableArray alloc] initWithCapacity:0];//偶数位数组
for (int i=0; i< forwardDescArr.count; i++) {
int num = [forwardDescArr[i] intValue];
if (i%2) {//偶数位
[arrEvenNum addObject:[NSNumber numberWithInt:num]];
}else{//奇数位
if (num * 2 < 9) {
[arrOddNum addObject:[NSNumber numberWithInt:num * 2]];
}else{
int decadeNum = (num * 2) / 10;
int unitNum = (num * 2) % 10;
[arrOddNum2 addObject:[NSNumber numberWithInt:unitNum]];
[arrOddNum2 addObject:[NSNumber numberWithInt:decadeNum]];
}
}
}
__block NSInteger sumOddNumTotal = 0;
[arrOddNum enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL *stop) {
sumOddNumTotal += [obj integerValue];
}];
__block NSInteger sumOddNum2Total = 0;
[arrOddNum2 enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL *stop) {
sumOddNum2Total += [obj integerValue];
}];
__block NSInteger sumEvenNumTotal =0 ;
[arrEvenNum enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL *stop) {
sumEvenNumTotal += [obj integerValue];
}];
NSInteger lastNumber = [lastNum integerValue];
NSInteger luhmTotal = lastNumber + sumEvenNumTotal + sumOddNum2Total + sumOddNumTotal;
return (luhmTotal%10 ==0)?YES:NO;
}
iOS中使用Luhn算法验证银行卡
最新推荐文章于 2019-07-12 13:45:06 发布