文本框检查Regex表达式不允许小数

use*_*103 4 c# regex validation textbox winforms

我想创建一个TextChanged事件来检查输入文本是否符合特定条件,如果没有,则删除输入的最后一个字符.在这种情况下,标准是数字,1个小数和1个分数.

我正在测试正则表达式只是为了数字和小数,并遇到了一个问题.我已经尝试了几种不同的表达方式(我写自己很糟糕,因此它们可以从各种其他堆栈溢出问题中获取),结果每次都是相同的.它接受数字就好了,但它不接受小数.任何帮助将不胜感激!

        string isNumber = @"^\d{1,9}(\.\d{1,9})?$";

        private void TextBox_TextChanged(object sender, EventArgs e)
        {
            TextBox text = (TextBox)sender;

            Match match = Regex.Match(text.Text, isNumber);

            if (!match.Success)
            {
                if (text.Text.Length > 1)
                    text.Text = text.Text.Substring(0, text.Text.Length - 1);
                else
                    text.Text = "";

                text.Select(text.Text.Length, 0); //set cursor to the end 
                                                  //of the string
            }
        }
Run Code Online (Sandbox Code Playgroud)

Bri*_*ers 6

我认为问题在于您尝试逐个字符地验证用户类型的数字,但是如果临时值不是无效值,则无法键入有效的十进制数.

考虑用户键入值时会发生什么1.2:

  1. 用户键入字符1.
  2. 验证会因为文本框的值发生更改而触发.
  3. 1 是有效的小数,因此验证通过.
  4. 用户继续键入,添加小数点字符 .
  5. 验证再次触发,因为文本框的值已更改.
  6. 1. 根据正则表达式,它不是有效的小数,因此最后一个字符将被删除.
  7. 现在回到文本框的值1.
  8. 用户感到沮丧.转到第4步.

如您所见,无法输入小数点.但是,如果您尝试更改正则表达式以允许小数点存在而没有后续数字,那么如果用户在键入小数点后停止然后提交表单,则可能会出现无效值.

所以重点是,使用逐个字符的验证方案将不适用于小数.更好的方法是允许用户在框中输入他们想要的内容,然后在用户完成输入后进行验证.您可以通过验证文本框何时失去焦点或何时提交表单来执行此操作.