判斷使用者輸入的銀行卡號是否正確的方法(基於Luhn演算法的格式校驗)

受到鼓舞人發表於2022-03-14

開發中,有時候,為了打造更好的使用者體驗,同時減輕伺服器端的壓力,需要對於一些如,手機號碼,銀行卡號,身份證號碼進行格式校驗

下面是判斷銀行卡號輸入是否正確的程式碼(基於Luhn演算法的格式校驗):

iOS程式碼:

/**
 * 銀行卡格式校驗
 *
 * @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程式碼:

/**
 
 * 匹配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的代理

- (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演算法的格式校驗)就是小編分享給大家的全部內容了,希望能給大家一個參考。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70015105/viewspace-2870880/,如需轉載,請註明出處,否則將追究法律責任。

相關文章