wpf文本框的正则表达式

q5iwbnjs  于 2023-04-07  发布在  其他
关注(0)|答案(2)|浏览(129)

谁能帮我做一个正则表达式?

  • 只有数字(正数和负数)
  • 仅最多一个点(可选)
  • 最大精度0.00(可选)
  • 逗号(,)应替换为点(.)

代码如下:

<TextBox PreviewTextInput="NumberValidationTextBox"/>

private void NumberValidationTextBox(object sender, TextCompositionEventArgs e)
        {
            Regex regex = new Regex("[^0-9.]+");
            e.Handled = regex.IsMatch(e.Text);
        }

谢谢。

lokaqttq

lokaqttq1#

“^-?[0-9]*[\\.,]?[0-9]?[0-9]?$”

这会检测有效的输入,但不会将','转换为'.'。只需执行字符串替换即可。您可以安全地假设此时测试中的任何','都应该是'.'。

vhipe2zx

vhipe2zx2#

问题在于你的方法:
e.文本给出键入的字符,而不是TextBox的内容
所以这个解决方案给出了等待的结果:

private void NumberValidationTextBox(object sender, TextCompositionEventArgs e)
    {
        Regex regex = new Regex("^-?[0-9]*[\\.,]?[0-9]?[0-9]?$");
        var futureText = $"{(sender as TextBox).Text}{e.Text}";
        e.Handled = !regex.IsMatch(futureText);
    }

要将,替换为.,我建议您添加TextChanged事件:

private void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        var myInput = sender as TextBox;

        myInput.Text = myInput.Text.Replace(",", ".").Trim();
        myInput.CaretIndex = myInput.Text.Length;
    }
<TextBox PreviewTextInput="NumberValidationTextBox" TextChanged="OnTextChanged"/>

i使用属性CaretIndex将光标保持在最后一个位置(替换将光标的位置重置在第一个位置)
我已经将.trim()添加到myInput.Text = myInput.Text.Replace(",", ".").Trim();中,因为previewtextInput事件不会与space一起播放(正常)

相关问题