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

所属分类: 网络编程 / 正则表达式 阅读数: 1567
收藏 0 赞 0 分享

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

下面是判断银行卡号输入是否正确的代码(基于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算法的格式校验)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

正则表达式匹配 非XXX的行

问题:如何匹配"非:.+123.123.123.10.+ " 行
收藏 0 赞 0 分享

正则表达式不包含属性

一个标签里不包含某个属性 的 正则表达式的写法
收藏 0 赞 0 分享

ASP正则函数替换分页后的参数

在分页系统里面用到的把page后面得东西都给丢掉
收藏 0 赞 0 分享

asp match正则函数使用Matchs实例

asp matchs函数提供了对正则表达式匹配的只读属性的访问。一直都用这个函数,没想到本站竟然没有这类文章,汗一个,最近我会多加一些这样的文章
收藏 0 赞 0 分享

asp 图片正则 替换,替换前检查图片是不是本地地址的方法

这个图片正则先检查图片的地址,不是本地的则用本地的asp突破盗链,方便使用,注意是答chinaz的朋友问的一个问题
收藏 0 赞 0 分享

java正则表达式彻底研究

从J2SE1.4起Java增加了对正则表达式的支持就是java.util.regex包
收藏 0 赞 0 分享

正则表达式口诀 正则表达式学习工具

正则表达式口诀 + 常用的正则表达式 + 正则表达式学习工具+正则处理工具 正则是每个程序员绕不开的堡垒,只有把它攻下来。我觉得正则之所以难,第一难是需要记忆,第二难是要求具备抽象逻辑思维。
收藏 0 赞 0 分享

比较实用的正则表达式学习笔记

最近在学习正则,一些比较有用的东西怕忘记,记下来,比较乱,想一条记录一条
收藏 0 赞 0 分享

asp只采集网站可见文本的正则

它可以过虑Js 可以过滤 CSS 过滤HTML标识,只采集页面的可见文本。
收藏 0 赞 0 分享

asp.net常用正则表达式

比较常用的多种语言支持的正则整理收集
收藏 0 赞 0 分享
查看更多