2012-05-01 61 views

回答

39

貫徹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; 
} 

這產生由小數點分割字符串數組,所以如果有一個以上的小數點我們將有陣列中的至少3個元素。

+1

而不是使用componentsSeparatedByString,您可以使用NSRegularExpression來確定newString是否包含多個小數。 –

+1

真的!有很多方法可以做到這一點。我通常使用這個,因爲我經常想要做一些不同的整數和小數部分。 – lnafziger

+0

使用正則表達式可以更好地控制文本字段接受的字符以及它們將採用的格式。 – nizx

2
-(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]; 
      } 
     } 
    } 
} 
0

簡而言之,數字格式如下[NSString stringWithFormat:@"%9.5f", x];其中5是「,」後面的小數。

13

下面是一個正則表達式的例子,該例子僅限於一個小數點和2個小數點。您可以調整它以適應您的需求。

- (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; 
} 
+2

好的答案。作爲一個建設性的評論家,我會建議您提高RegEx知識。比如「([0-9] +)?」可以替換爲「[0-9] *」,這使得它更具可讀性,並且性能更高。我已經對答案做了適當的改進。 –

+0

@「^ - ?[0-9] *((\\。|,)[0-9] {0,2})?$」也可以輸入負數。 –

5

大廈接受的答案,下面的方法確認3例錢格式處理時很有用:

  1. 極大量小數點後
  2. 超過200個字符
  3. 超過1小數點

請確保您的文本字段的del egate設置正確,你的類符合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; 
} 
+0

有一種情況沒有正確處理:如果您在dollarAmount中已達到6個字符,則無論如何您都可能想要輸入centAmount。 –

0

我做出瞭解決方案,爲您帶來控制小數計算,所以用戶可以鍵入只有一個小數點分隔符,你也可以有超過小數的控制數。

只需設置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; 
} 
2

試試這個: -

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 
} 
+0

'text'可以是多個字符,所以你不能像這樣檢查它。 – trapper

5

爲SWIFT 2。3,防止用戶對後兩個地方輸入十進制數 -

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 
      } 
     } 
    } 
} 
+0

歡迎來到Stack Overflow!儘管您可能已經解決了此用戶的問題,但僅有代碼的答案對於未來出現此問題的用戶來說並不是很有幫助。請編輯您的答案,以解釋爲什麼您的代碼可以解決原始問題。 –

1

斯威夫特3

無需創建一個數組,並檢查計數。限制用戶只能像這樣放置1個小數點。

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

夫特3實現此UITextFieldDelegate方法,以防止用戶從輸入的數字無效:

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)。