2016-06-14 51 views
-1

我有一個要求驗證一個十進制數,即整數部分可以具有高達5個字符和分數值可以具有高達2個字符。 (分數值是可選的)。我已經嘗試了很多,我最終以低於表達。正則表達式來驗證十進制數

"^([0-9]{0,5})((.|,)[0-9]{0,2})?$" 

一切都很好,除了非十進制值(沒有./,存在的地方)。

即。表達接受99999999

任何幫助將不勝感激。

+0

爲什麼使用正則表達式?使用'NSNumberFormatter'。然後,您可以正確處理來自不同地區的用戶輸入的號碼。 – rmaddy

+0

@rmaddy NSNumberFormatter爲999.999給出了正確的數字,儘管我給了maximumFractionDigits = 2 – Rajesh

+0

你能跟我分享一個例子嗎? – Rajesh

回答

2

你的正則表達式的問題是點:如果沒有正確的轉義,點字符('。')將接受除換行符之外的任何字符(請參閱此quick reference)。

爲了表示字面點,你必須用反斜槓轉義它( '\'),那麼你的正則表達式最終看起來像這樣:

"^([0-9]{0,5})((\.|,)[0-9]{0,2})?$" 
+0

不會減慢問題 – Rajesh

-1

// trye這樣

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: (NSRange)range replacementString:(NSString *)string { 

    if([string isEqualToString:@""]) { 
      return YES; 
     } 
     if(string.length > 1) { 
      return NO; 
     } 
     if ([textField.text rangeOfString:@"."].location != NSNotFound) { 
      if([string rangeOfString:@"."].location != NSNotFound) { 
       return NO; 
      } 
      NSString *strTemptext = [textField.text stringByReplacingOccurrencesOfString:@"." withString:@"$#"]; 
      NSArray *arrComponants = [strTemptext componentsSeparatedByString:@"$"]; 
      NSString *strText = @""; 
      if (arrComponants.count > 0) { 
       if([(NSString *)[arrComponants objectAtIndex:0] containsString:@"#"]) { 
        strText = [arrComponants objectAtIndex:0]; 
       } else { 
        strText = [arrComponants objectAtIndex:1]; 
       } 
      } else { 
       strText = [arrComponants objectAtIndex:0]; 
      } 
      if([strText length] >= 3) { 
       return NO; 
      } 

     } 
     if(textField.text.length >= 5 && [textField.text rangeOfString:@"."].location == NSNotFound && [string rangeOfString:@"."].location == NSNotFound) { 
      return NO; 
     } 
     if([textField.text rangeOfString:@"."].location != NSNotFound && textField.text.length > 7) { 
      return NO; 
     } 
     return YES; 
    } 
} 
0

這個表達式傳遞

"^([0-9]{0,5}+)?(\\.([0-9]{1,2})?)?$" 

謝謝大家誰試圖幫助我。