2013-11-27 37 views
1

我有這樣的正則表達式C#ASP.NET MVC3模型驗證:百分比正則表達式用逗號

[RegularExpression(@"[0-9]*\,?[0-9]?[0-9]")] 

這適用於幾乎所有情況下,除非數量大於100大於100 的任何數值應該顯示錯誤。 我已經嘗試過使用[Range],但它不適用於逗號。

有效期:0/0,0/0,00-100/100,0/100,00。

無效(Number> 100)。

+0

你是如何接受這個價值?爲什麼不會'int.TryParse()'工作? – paqogomez

+1

除了@paqogomez的建議,你可以在這裏看到它的動作:http://stackoverflow.com/questions/1824326/convert-toint32-a-string-with-commas – brandonscript

回答

2

不知道零名的是在最終只可選的數字,但

# (?:100(?:,0{1,2})?|[0-9]{1,2}(?:,[0-9]{1,2})?) 

(?: 
     100 
     (?: , 0{1,2})? 
    | 
     [0-9]{1,2} 
     (?: , [0-9]{1,2})? 
) 

Zero的在年底

# (?:100|[0-9]{1,2})(?:,0{1,2})? 

(?: 
     100 
    | [0-9]{1,2} 
) 
(?: , 0{1,2})? 

唯一的選擇,中,排列了沒有前導零的除了零本身

# (?:100(?:,0{1,2})?|(?:0|[1-9][0-9]?)(?:,[0-9]{1,2})?) 

(?: 
     100 
     (?: , 0{1,2})? 
    | 
     (?: 
      0 
     | 
      [1-9] [0-9]? 
    ) 
     (?: , [0-9]{1,2})? 
) 


# (?:100|0|[1-9][0-9])(?:,0{1,2})? 

(?: 
     100 
    | 
     0 
    | 
     [1-9] [0-9] 
) 
(?: , 0{1,2})? 
+1

你需要包括字符串控件的開始和結束,否則它仍然會匹配較大的數字。快速和骯髒,「^(?: 100 | [0-9] {1,2})($ |,0 {1,2})$」起作用。 – neilh

+0

在示例中,OP沒有顯示^ $ anchor。我也不會。而快速和骯髒的正則表達式使錨點變得難以閱讀,而^(?: 100 | [0-9] {1,2})(?:,0 {1,2})?$是可以的,因爲回溯並沒有真正的去處。 – sln

+1

而且,我在這裏沒有投票,所以... – sln

1

這是正則表達式符合您的標準:

^(?:(?:[0-9]|[1-9]{1,2})(?:,[0-9]{1,2})?|(?:100)(?:,0{1,2})?)$ 

(假設你的使用情況,我認爲你的字符序列出現的本身就是嵌入其他內容。請讓我知道這是不是這樣的。)

這裏是一個Perl的程序這表明,正則表達式的樣本數據集。 (另見live demo。)

#!/usr/bin/env perl 

use strict; 
use warnings; 

while (<DATA>) { 
    chomp; 

    # A1 => An integer between 1 and 99, without leading zeros. 
    #  (Although zero can appear by itself.) 
    # 
    # A2 => A optional fractional component that may contain no more 
    #  than two digits. 
    # 
    # -OR- 
    # 
    # B1 => The integer 100. 
    # 
    # B2 => A optional fractional component following that may 
    #  consist of one or two zeros only. 
    # 

    if (/^(?:(?:[0-9]|[1-9]{1,2})(?:,[0-9]{1,2})?|(?:100)(?:,0{1,2})?)$/) { 
    #   ^^^^^^^^A1^^^^^^ ^^^^^A2^^^^  ^B1 ^^^B2^^ 

     print "* [$_]\n"; 
    } else { 
     print " [$_]\n"; 
    } 
} 

__DATA__ 
0 
01 
11 
99 
100 
101 
0,0 
0,00 
01,00 
0,000 
99,00 
99,99 
100,0 
100,00 
100,000 
100,01 
100,99 
101,00 

預期輸出

* [0] 
    [01] 
* [11] 
* [99] 
* [100] 
    [101] 
* [0,0] 
* [0,00] 
    [01,00] 
    [0,000] 
* [99,00] 
* [99,99] 
* [100,0] 
* [100,00] 
    [100,000] 
    [100,01] 
    [100,99] 
    [101,00] 
+0

這正是我要找的,謝謝! – WagnerMaurer

+2

OP指出的一件事是'Valid:0,00 - 100'。我只能假設> 100將是你的正則表達式匹配的'100.99'。也許你可以稍作修改 - '^(?:[0-9] | [1-9] [0-9] | 100(?=(?:,0 {1,2})?$ ))(?:,[0-9] {1,2})?$',+1無論如何 – sln

+0

@sln - 對,你是。而你的正則表達式完美無缺!但是,我修正了我的正則表達式,因此終止'$'只會出現一次。我的方法:** A)**首先檢查一位或兩位數字和一個可選小數部分,然後** B)**檢查數字「100」及其可選小數部分(可能包括一個或兩個零)。我還包括了其他數據樣本。如果你看到我修改後的正則表達式的任何缺點與你的,請讓我知道。 – DavidRR