iOS中使用Luhn算法验证银行卡

</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;
    
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值