文本框仅接受数值

时间:2011-04-25 13:39:23

标签: c# regex winforms

应允许用户在文本框中仅输入小数值

监听此keydown事件,并将值与正则表达式

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

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

,用作欧洲语言的小数分隔符

数字的格式可以是

+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 我需要修改正则表达式

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我不会与正则表达式匹配,只需执行Double.TryParse,如果正确解析则使用该数字。

您是否有理由要求它与RegEx完全匹配?

答案 2 :(得分:0)

如果要将小数点后的数字限制为6,则不应使用正则表达式

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

请注意,原始版本中的5将替换为6.您提供的值与正则表达式不匹配,因为它们在小数点后面有6位数字,而您的正则表达式预期在0到5之间。

答案 3 :(得分: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;
    }
}
相关问题