在文本框里輸入金額的話,顧名思義,就是小數點之后只有兩位數.我們知道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 格式,所以也可以很好的避免,通過拷貝造成的不是字符串的問題.