zoukankan      html  css  js  c++  java
  • 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;
        }
    }
     
     
  • 相关阅读:
    MVC模式-----struts2框架(2)
    MVC模式-----struts2框架
    html的<h>标签
    jsp脚本元素
    LeetCode "Paint House"
    LeetCode "Longest Substring with At Most Two Distinct Characters"
    LeetCode "Graph Valid Tree"
    LeetCode "Shortest Word Distance"
    LeetCode "Verify Preorder Sequence in Binary Search Tree"
    LeetCode "Binary Tree Upside Down"
  • 原文地址:https://www.cnblogs.com/10-19-92/p/6762655.html
Copyright © 2011-2022 走看看