iOS 中 使用UITextField格式化银行卡号码的解决方案
今天做格式化银行卡,避免重复造轮子,找度娘查了下,看到一个不错的实现方式,记录下来,并附带实现思路
#pragmamark-UITextFieldDelegateUITextField键入字符后调用
-(BOOL)textField:(UITextField*)textFieldshouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString*)string{
//拿到为改变前的字符串
NSString*text=[textFieldtext];
//键入字符集,\b标示删除键
NSCharacterSet*characterSet=[NSCharacterSetcharacterSetWithCharactersInString:@"0123456789\b"];
//对当前键入字符进行空格过滤
string=[stringstringByReplacingOccurrencesOfString:@""withString:@""];
//invertedSet会对当前结果集取反,检查当前键入字符是否在字符集合中,如果不在则直接返回NO不改变textField值
if([stringrangeOfCharacterFromSet:[characterSetinvertedSet]].location!=NSNotFound){
returnNO;
}
//增加当前键入字符在改变前的字符串尾部
text=[textstringByReplacingCharactersInRange:rangewithString:string];
//再次确认去掉字符串中空格
text=[textstringByReplacingOccurrencesOfString:@""withString:@""];
//初始化字符用来保存格式化后的字符串
NSString*newString=@"";
//while中对text进行格式化
while(text.length>0){
//按4位字符进行截取,如果当前字符不足4位则按照当前字符串的最大长度截取
NSString*subString=[textsubstringToIndex:MIN(text.length,4)];
//将截取后的字符放入需要格式化的字符串中
newString=[newStringstringByAppendingString:subString];
if(subString.length==4){
//截取的字符串长度满4位则在后面增加一个空格符
newString=[newStringstringByAppendingString:@""];
}
//将text中截取掉字符串去掉
text=[textsubstringFromIndex:MIN(text.length,4)];
}
//再次确认过滤掉除指定字符以外的字符
newString=[newStringstringByTrimmingCharactersInSet:[characterSetinvertedSet]];
//国内银行卡一般为16~19位格式化后增加4个空格也就是最多23个字符
if(newString.length>23){
returnNO;
}
//手动对textField赋值
[textFieldsetText:newString];
//返回NO则不通过委托自动往当前字符后面增加字符,达到格式化效果
returnNO;
}