如何限制UITextField中的小数点数?

我有一个UITextField,点击时在左下angular出现一个小数点的数字键盘。 我试图限制该字段,以便用户只能放置1个小数点

例如
2.5 OK
2..5不行

实现像这样的shouldChangeCharactersInRange方法:

// Only allow one decimal point // Example assumes ARC - Implement proper memory management if not using. - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; NSArray *arrayOfString = [newString componentsSeparatedByString:@"."]; if ([arrayOfString count] > 2 ) return NO; return YES; } 

这将创build一个由小数点分割的string数组,所以如果有多个小数点,我们将在数组中至less有3个元素。

下面是一个正则expression式的例子,这个例子只限于一个小数点和两个小数点。 你可以调整它以适应你的需求。

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; NSString *expression = @"^[0-9]*((\\.|,)[0-9]{0,2})?$"; NSError *error = nil; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:&error]; NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString options:0 range:NSMakeRange(0, [newString length])]; return numberOfMatches != 0; } 

在接受的答案的基础上,下面的方法validation了三种有利于处理货币格式的情况:

  1. 数额非常大
  2. 小数点后面多于2个字符
  3. 多于一个小数点

确保你的文本字段的委托设置正确,你的类符合UITextField协议,并添加下面的委托方法。

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { // Check for deletion of the $ sign if (range.location == 0 && [textField.text hasPrefix:@"$"]) return NO; NSString *updatedText = [textField.text stringByReplacingCharactersInRange:range withString:string]; NSArray *stringsArray = [updatedText componentsSeparatedByString:@"."]; // Check for an absurdly large amount if (stringsArray.count > 0) { NSString *dollarAmount = stringsArray[0]; if (dollarAmount.length > 6) return NO; } // Check for more than 2 chars after the decimal point if (stringsArray.count > 1) { NSString *centAmount = stringsArray[1]; if (centAmount.length > 2) return NO; } // Check for a second decimal point if (stringsArray.count > 2) return NO; return YES; } 

对于Swift 2.3来说,防止用户input两位后的十进制数 –

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let decimalPlacesLimit = 2 let rangeDot = txtPrice.text!.rangeOfString(".", options: .CaseInsensitiveSearch) if rangeDot?.count > 0 { if (string == ".") { print("textField already contains a separator") return false } else { var explodedString = txtPrice.text!.componentsSeparatedByString(".") let decimalPart = explodedString[1] if decimalPart.characters.count >= decimalPlacesLimit && !(string == "") { print("textField already contains \(decimalPlacesLimit) decimal places") return false } } } } 
 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if(textField == min_textfield ) { if([textField.text rangeOfString:@"."].location == NSNotFound) { if([string isEqualToString:@"."] ) { flag_for_text = 1; } else { textField.text = [NSMutableString stringWithFormat:@"%@",textField.text]; } } else { if([string isEqualToString:@"."]) { return NO; } else { textField.text = [NSMutableString stringWithFormat:@"%@",textField.text]; } } } } 

尝试这个 :-

 public func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { if(text == "," || text == "." ){ let countdots = textView.text!.componentsSeparatedByString(".").count - 1 if countdots > 0 && (text == "." || text == "," ) { return false } } return true } 

Swift 3

不需要创build一个数组并检查计数。 限制用户只能像这样放置1个小数点。

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if (textField.text?.contains("."))! && string.contains(".") { return false } else { return true } } 

Swift 3实现这个UITextFieldDelegate方法来防止用户input一个无效的数字:

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let text = (textField.text ?? "") as NSString let newText = text.replacingCharacters(in: range, with: string) if let regex = try? NSRegularExpression(pattern: "^[0-9]*((\\.|,)[0-9]*)?$", options: .caseInsensitive) { return regex.numberOfMatches(in: newText, options: .reportProgress, range: NSRange(location: 0, length: (newText as NSString).length)) > 0 } return false } 

它使用逗号或点作为小数点分隔符。 您还可以使用此模式限制小数位数: "^[0-9]*((\\.|,)[0-9]{0,2})?$" (在本例中为2)。

在任何你设置你的UITextField委托的对象中,添加一个回答“ [- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string] ”的方法 。

然后你可以使用一个NSNumberFormatter对象,或者你可以强制检查一个已经存在的小数位标记(如果小数点已经存在,则返回NO )。

简而言之,数字格式如下[NSString stringWithFormat:@"%9.5f", x]; 其中5是“,”后的小数。

我提出的解决scheme,可以控制小数位数,所以用户只能input一个小数点,也可以控制小数位数。

只需正确设置decimalPlacesLimit值。

查看方法:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSLog(@"text on the way: %@", string); NSUInteger decimalPlacesLimit = 2; NSRange rangeDot = [textField.text rangeOfString:@"." options:NSCaseInsensitiveSearch]; NSRange rangeComma = [textField.text rangeOfString:@"," options:NSCaseInsensitiveSearch]; if (rangeDot.length > 0 || rangeComma.length > 0){ if([string isEqualToString:@"."]) { NSLog(@"textField already contains a separator"); return NO; } else { NSArray *explodedString = [textField.text componentsSeparatedByString:@"."]; NSString *decimalPart = explodedString[1]; if (decimalPart.length >= decimalPlacesLimit && ![string isEqualToString:@""]) { NSLog(@"textField already contains %d decimal places", decimalPlacesLimit); return NO; } } } return YES; } 
Interesting Posts