判断用户输入的银行卡号是否正确的方法(基于Luhn算法的格式校验)

时间:2022-09-19 11:13:56

开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验

下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验):

iOS代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/**
 
 * 银行卡格式校验
 
 *
 
 * @param cardNo 银行卡号
 
 *
 
 * @return
 
 */
 
+ (BOOL) checkCardNo:(NSString*) cardNo{
 
  
 
  
 
  int oddsum = 0;   //奇数求和
 
  int evensum = 0;  //偶数求和
 
  int allsum = 0;
 
  int cardNoLength = (int)[cardNo length];
 
  int lastNum = [[cardNo substringFromIndex:cardNoLength-1] intValue];
 
  
 
  cardNo = [cardNo substringToIndex:cardNoLength - 1];
 
  for (int i = cardNoLength -1 ; i>=1;i--) {
 
    NSString *tmpString = [cardNo substringWithRange:NSMakeRange(i-1, 1)];
 
    int tmpVal = [tmpString intValue];
 
    if (cardNoLength % 2 ==1 ) {
 
      if((i % 2) == 0){
 
        tmpVal *= 2;
 
        if(tmpVal>=10)
 
          tmpVal -= 9;
 
        evensum += tmpVal;
 
      }else{
 
        oddsum += tmpVal;
 
      }
 
    }else{
 
      if((i % 2) == 1){
 
        tmpVal *= 2;
 
        if(tmpVal>=10)
 
          tmpVal -= 9;
 
        evensum += tmpVal;
 
      }else{
 
        oddsum += tmpVal;
 
      }
 
    }
 
  }
 
  
 
  allsum = oddsum + evensum;
 
  allsum += lastNum;
 
  if((allsum % 10) == 0)
 
    return YES;
 
  else
 
    return NO;
 
}

Androd代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/**
 
 
 
 * 匹配Luhn算法:可用于检测银行卡卡号
 
 
 
 * @param cardNo
 
 
 
 * @return
 
 
 
 */
 
 
 
public static boolean matchLuhn(String cardNo) {
 
 
 
  int[] cardNoArr = new int[cardNo.length()];
 
 
 
  for (int i=0; i<cardNo.length(); i++) {
 
 
 
    cardNoArr[i] = Integer.valueOf(String.valueOf(cardNo.charAt(i)));
 
 
 
  }
 
 
 
  for(int i=cardNoArr.length-2;i>=0;i-=2) {
 
 
 
    cardNoArr[i] <<= 1;
 
 
 
    cardNoArr[i] = cardNoArr[i]/10 + cardNoArr[i]%10;
 
 
 
  }
 
 
 
  int sum = 0;
 
 
 
  for(int i=0;i<cardNoArr.length;i++) {
 
 
 
    sum += cardNoArr[i];
 
 
 
  }
 
 
 
  return sum % 10 == 0;
 
 
 
}

附(银行卡号格式化):

在输入银行卡号过程中,通常,我们会每隔4位插入一个"-",类似"1332-2131-2313-1231-212"这种的格式
可以通过以下方法实现:

设置textField的代理

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
 
{
 
  NSString *text = [textField text];
 
  NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789\b"];
 
  string = [string stringByReplacingOccurrencesOfString:@"-" withString:@""];
 
  if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) {
 
    return NO;
 
  }
 
  
 
  text = [text stringByReplacingCharactersInRange:range withString:string];
 
  text = [text stringByReplacingOccurrencesOfString:@"-" withString:@""];
 
  
 
  NSString *newString = @"";
 
  while (text.length > 0) {
 
    NSString *subString = [text substringToIndex:MIN(text.length, 4)];
 
    newString = [newString stringByAppendingString:subString];
 
    if (subString.length == 4) {
 
      newString = [newString stringByAppendingString:@"-"];
 
    }
 
    text = [text substringFromIndex:MIN(text.length, 4)];
 
  }
 
  
 
  newString = [newString stringByTrimmingCharactersInSet:[characterSet invertedSet]];
 
  
 
  if (newString.length >= 24) {
 
    return NO;
 
  }
 
  
 
  [textField setText:newString];
 
  
 
  return NO;
 
}

最后,怎么获得不包含符号"-"的银行卡号呢?

[self.textField.text stringByReplacingOccurrencesOfString:@"-" withString:@""]

以上这篇判断用户输入的银行卡号是否正确的方法(基于Luhn算法的格式校验)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。