在文本框里输入金额的话,顾名思义,就是小数点之后只有两位数.我们知道textFiled 的代理- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
是对文字进行限制的.如果返回 NO, 则文字不能改变.那么就在这里动手脚.
// 输入金额 限制两个小数
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if ([textField.text containsString:@"."]) {
if ([string isEqualToString:@"."]) return NO;
NSRange rangeOfPoint = [textField.text rangeOfString:@"."];
if (range.location > rangeOfPoint.location + 2) return NO;
}
return YES;
}
这是最开始的写法,确实可以限制文字的输入.但是在某次测试时,发现,当光标位置生改变之后,就会出问题,而且对于复制粘贴,无法控制.
所以下面改了一下思路, 使用正则表达式进行控制.
// 输入金额 限制两个小数
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// 获取光标
UITextRange *textRange = textField.selectedTextRange;
NSNumber *number = [textRange.start valueForKey:@"offset"];
NSMutableString *str = [textField.text mutableCopy];
[str insertString:string atIndex:[number integerValue]];
// 判断是否是金额格式 (PS: 在分类里面)
if ([str isMoney]) {
return YES;
} else {
return NO;
}
}
这是NSString 的分类
- (BOOL)match:(NSString *)pattern
{
// 1.创建正则表达式
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];
// 2.测试字符串
NSArray *results = [regex matchesInString:self options:0 range:NSMakeRange(0, self.length)];
return results.count > 0;
}
- (BOOL)isMoney {
return [self match:@"^\\d*+(\\.\\d{0,2})?$"];
}
由于通过参数里面传来的字符串先拼接成最终的字符串,进行判断是否是 money 格式,所以也可以很好的避免,通过拷贝造成的不是字符串的问题.
网友评论