textField如何限制金额输入

在文本框里输入金额的话,顾名思义,就是小数点之后只有两位数.我们知道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 格式,所以也可以很好的避免,通过拷贝造成的不是字符串的问题.

你可能感兴趣的:(textField如何限制金额输入)