2013-04-25 69 views
1

我真的無法找到正則表達式以十進制形式輸入價格的任何解決方法。 這是我想要的: -以十進制表示驗證價格的正則表達式

12345.1

12345.12

12345.123

0.123

0.123

我也想限制數字。

我真的創建了一個但假設沒有驗證

^([0-9] {1,5} |([0-9] {1,5} \([0-9] {1,3})))$

也想知道如何是上面的表達式從不同的一個

^([0-9] {1,5} |([0-9] 。([0-9] {1,3})))$這工作正常。

任何人都有很好的解釋。

「我使用NSRegularExpression - 目標C」 如果這能幫助回答更準確

- (IBAction)btnTapped { 

     NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern: 
     @"^\\d{1,5}([.]\\d{1,3})?|[.]\\d{1,3}$" options:NSRegularExpressionCaseInsensitive error:&error]; 

    if ([regex numberOfMatchesInString:txtInput.text options:0 range:NSMakeRange(0, [txtInput.text length])]) 
     NSLog(@"Matched : %@",txtInput.text); 
    else 
     NSLog(@"Not Matched : %@",txtInput.text); 
} 

「我在buttonTap方法做這件事」。

+1

如果答案符合您的需求,而不是像您所做的那樣將其置於原始問題中,則應該更好地[接受它](http://meta.stackexchange.com/a/5235)。這樣,你的問題將被標記爲*已解決*,然後可能對其他人有用。您已經提出的其他問題也一樣。 – sp00m 2013-04-25 11:08:47

+0

我真的誤添了你的表情,,,,,道歉相同 – 2013-04-25 11:27:18

回答

8

這簡單的一應滿足您的需求:

\d*[.]?\d+ 

「數字(\d+),前面可以有一個點([.]?),它本身可以前面有數字(\d*)。」

由於您在談論價格,因此既不需要科學記數法也不需要負數。


正如興趣點,這裏是一個我常用,科學記數和負數包括:

[-+]?\d*[.]?\d+(?:[eE][-+]?\d+)? 

對於新的要求(見註釋),你可以不指定我給第一個正則表達式需要多少位數,因爲它不是內置的。由點本身其次是最大

\d{1,5}([.]\d{1,3})?|[.]\d{1,3} 

「最多5位(\d{1,5})可能隨後((...)?)3位([.]\d{1,3}),或(|)簡單地說:

這應該更好地滿足您的需求一個點後跟最多3位數字([.]\d{1,3})「

+0

Ahahaha,這忽略了+/-和第一個數字之間的(可選的)空白的可能性... – 2013-04-25 10:32:58

+0

哦,等等,我錯了,double.TryParse也不會在中間和數字之間留下空格。提交錯誤785552的.NET框架:) – 2013-04-25 10:41:16

+0

嘗試123,123.45不工作使用NSRegularExpression - 目標C ,,,尚未解決... – 2013-04-25 11:06:57

0

如何:^([+-])?(\d+)?([.,])?(\d+)?$

  string input = "bla"; 
      if (!string.IsNullOrWhiteSpace(input)) 
      { 
       string pattern = @"^(\s+)?([-])?(\s+)?(\d+)?([,.])?(\d+)(\s+)?$"; 

       input = input.Replace("\'", ""); // Remove thousand's separator 
       System.Text.RegularExpressions.Regex.IsMatch(input, pattern); 
       // if server culture = de then reverse the below replace 
       input = input.Replace(',', '.'); 
      } 

編輯:
哦,哦 - 剛剛意識到這就是我們碰上如果EN-US用戶使用問題的一點點「」作爲千的分隔....

所以這裏一個更好的:

 string input = "+123,456"; 
     if (!string.IsNullOrWhiteSpace(input)) 
     { 
      string pattern = @"^(\s+)?([+-])?(\s+)?(\d+)?([.,])?(\d+)(\s+)?$"; 

      input = input.Replace(',', '.'); // Ensure no en-us thousand's separator 
      input = input.Replace("\'", ""); // Remove thousand's separator 
      input = System.Text.RegularExpressions.Regex.Replace(input, @"\s", ""); // Remove whitespaces 

      bool foo = System.Text.RegularExpressions.Regex.IsMatch(input, pattern); 
      if (foo) 
      { 
       bool de = false; 
       if (de) // if server-culture = de 
        input = input.Replace('.', ','); 

       double d = 0; 
       bool bar = double.TryParse(input, out d); 
       System.Diagnostics.Debug.Assert(foo == bar); 

       Console.WriteLine(foo); 
       Console.WriteLine(input); 
      } 
      else 
       throw new ArgumentException("input"); 
     } 
     else 
      throw new NullReferenceException("input"); 

編輯2:
而不是通過獲取服務器文化的麻煩,只是使用tryparse重載與文化,不要重新替代小數點分隔符。

double.TryParse(input 
       , System.Globalization.NumberStyles.Any 
       , new System.Globalization.CultureInfo("en-US") 
       , out d 
); 
+0

不需要放太多括號。而且,'(X +)?'應該減少到'X *'。完全是你的,但減少了:'^ \ s * [+ - ]?\ s * \ d * [。,]?\ d + \ s *?$'。另外,最後一個空格的*懶惰匹配並不是真的需要。 – sp00m 2013-04-25 10:54:34

1

讓我們做這每個當事人之間:在開始

  • 登錄:[+-]?
  • 分數號:\.\d+
  • 可能的組合(符號後):
    • 號碼:\d+
    • 分數不爲零\.\d+
    • 和數量與比例:\d+\.\d+

因此加入它一起<sign>(number|fraction without zero|number with fraction)

^[+-]?(\d+|\.\d+|\d+\.\d+)$ 
0

如果你不限制長度,小數點前5位和3位之後,那麼你可以使用這個:最大前後

^[+-]?(?:[0-9]*\.[0-9]|[0-9]+)$ 

如果你是制約其5和3,那麼你」 ð需要的東西是這樣的:

^[+-]?(?:[0-9]{0,5}\.[0-9]{1,3}|[0-9]{1,5})$ 

至於你的正則表達式的區別去,第一個限制的位數長度十進制標記之前1-5與不存在小數。第二個只允許在小數點前面有一個數字,如果沒有小數點,則只允許1-5個數字。