文本框只接受数值

本文关键字:文本 | 更新日期: 2023-09-27 17:52:42

应该允许用户在文本框中只输入十进制值

监听此keydown事件的

,并将值与正则表达式

进行比较。
@"^(('+|-)?('d*))+(('.|,)'d{0,5})?$";

这里的目的是将小数位限制为6。

,用作欧洲语言

的小数分隔符。

数字的格式可以是

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

如果在时尚中输入的表达式工作正常

假设文本框中输入的值为100.123456现在如果想修改上面的值,像下面的

1100.123456
1001.123456

我不能修改,因为正则表达式。IsMatch返回false,如果正则表达式。Ismatch返回false我正在抑制键事件

为什么正则表达式。当100.123456被修改为11000.123456时,Ismatch返回false是否需要修改正则表达式

文本框只接受数值

难道不能简单地设置文本框的属性或属性,使其只接受数字输入吗?

我不会匹配一个正则表达式,只是做Double.TryParse,如果它正确解析使用该数字。

是否有一个原因,你需要它匹配一个RegEx完全?

如果您想将小数点后的数字限制为6,您不应该使用Regex

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

注意原来的5被6代替了。您提供的值与正则表达式不匹配,因为它们在小数点后有6位数字,而您的Regex期望在0到5之间(包括0到5)。

让我在回答这个问题之前先说:这类事情最好由第三方控件来处理。这样,解决方案就可以完全处理极端情况和必要的测试。

KeyDown事件将在控件中的文本更改之前触发。如果你比较文本框的.Text值在你的正则表达式,它不会有新的值。

您可以尝试生成在键被允许时将被创建的字符串,然后对它运行正则表达式。

(带道具到c#如何将虚拟键码转换为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;
    }
}