2011-04-25 57 views
0

用戶應該允許該keydown事件是聽在文本框中文本框接受數值僅

只輸入十進制值和值進行比較的正則表達式

@"^((\+|-)?(\d*))+((\.|,)\d{0,5})?$"; 

這裏的目的是小數位限制至6

,用作小數分隔符爲歐洲語言

的備考數字的t可

+100, 100 
-100 
.12 
10.12 ..... 

如果在時尚輸入的表達式工作正常

想在文本框中輸入值100.123456 現在如果要修改類似下面

1100.123456 
1001.123456 
上述值

我無法修改,因爲 Regex.IsMatch返回false,如果regex.ismatch返回false我禁止鍵盤事件

當100.123456被修改爲1100.123456 爲什麼regex.ismatch返回false我是否需要修改的正則表達式

回答

0

不能您只需設置文本框的屬性或屬性,使其只接受數字輸入?

+0

僅正常文本框用於 – Raghav55 2011-04-25 13:52:17

0

我不會匹配正則表達式,只是做Double.TryParse,如果它解析正確使用該數字。

是否有原因需要它來完全匹配RegEx?

+0

intitally我嘗試使用的TryParse,但如何限制用戶停止後第六小數位 – Raghav55 2011-04-25 13:53:55

0

如果你想在小數點後6限制的數字,你不應該使用正則表達式

^((\+|-)?(\d*))+((\.|,)\d{0,6})?$ 

注5從原來的由6您所提供的值替換不符合您的正則表達式,因爲它們在小數點後有6位數字,而您的正則表達式的期望值介於0和5之間(含)。

+0

6變爲輸入值5,但問題仍然存在 – Raghav55 2011-04-25 13:59:08

0

讓我先說這個答案,說:這是可能最好由第三方控制處理的事情。這樣解決方案完全處理角落案件和必要的測試。

KeyDown事件將在控件中的文本更改之前觸發。如果您正在比較正則表達式中的文本框.Text值,則不會獲得新值。

您可以嘗試生成如果允許鍵可以創建的字符串,然後針對它運行正則表達式。

(配道具C# How to translate virtual keycode to char?

[DllImport("user32.dll")] 
static extern int MapVirtualKey(uint uCode, uint uMapType); 

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    string number = textBox1.Text; 

    if ((e.KeyData & Keys.Delete) == Keys.Delete) 
    { 

    } 
    else if ((e.KeyData & Keys.Back) == Keys.Back) 
    { 

    } 
    else 
    { 
     // 2 is used to translate into an unshifted character value 
     int nonVirtualKey = MapVirtualKey((uint)e.KeyData, 2); 
     char mappedChar = Convert.ToChar(nonVirtualKey); 

     string proposedString = number.Remove(textBox1.SelectionStart, textBox1.SelectionLength).Insert(textBox1.SelectionStart, mappedChar.ToString()); 

     bool works = Regex.IsMatch(proposedString, @"^((\+|-)?(\d*))+((\.|,)\d{0,5})?$"); 

     e.SuppressKeyPress = !works; 
    } 
}