使用小数C#的WPF过滤器文本框输入

时间:2017-01-05 16:12:25

标签: c# regex wpf

我已使用以下代码成功过滤掉除数字之外的任何内容。我利用PreviewTextInput事件来捕获当前输入:

private void NumericValidation(object sender, TextCompositionEventArgs e)
{
    e.Handled = !_numericValidator.IsMatch(e.Text);
}

_numericValidator定义为_numericValidator = new Regex("^[0-9]+$");

此代码完全正常,只允许将0-9输入文本框。

但是,我希望允许一个小数,这样输入可以更精确。我在RegexBuddy中测试了以下正则表达式,它可以正常工作,但我可以在文本框中输入1..14.3.5之类的无效数字。

^(?!\.{2,})(?:\d+)?(?:\.{0,1})?(?:\d+)?$

关于我接下来应该尝试什么的任何建议?

1 个答案:

答案 0 :(得分:0)

我在下面提出的示例允许用户在WPF App中输入所有正数。

  • 如果第一个字符为.,则会自动更改为0. 如果第一个字符将是0,第二个字符将是另一个字符,它 自动在点之间添加点。
在XAML中

<TextBox Width="100" x:Name="tb" TextChanged="Tb_OnTextChanged" FontSize="20" Margin="15,15,15,15"/>

代码:

private void Tb_OnTextChanged(object sender, TextChangedEventArgs e) {
      var tbx = e.OriginalSource as TextBox;
      string dd = tbx ? .Text;
      if (tbx == null || string.IsNullOrEmpty(dd)) return;
      var tt = dd.Select(r = > r.ToString()).ToList();
      var myregex = ".1234567890".Select(r = > r.ToString()).ToList();
      var ss = new List < string > ();
      tt.ForEach(o = > {
          if (ss.Contains(".") && o != "." || !ss.Contains(".")) {
              if (myregex.Contains(o))
                  ss.Add(o);
              if (ss.FirstOrDefault() == ".") {
                  ss[0] = "0";
                  ss.Add(".");
              }
              if (ss.Count == 2 && ss.FirstOrDefault() == "0" && o != ".") {
                  ss[1] = ".";
                  ss.Add(o);
              }
          }
      });
      var sbc = new StringBuilder();
      ss.ForEach(u = > sbc.Append(u));
      tb.Text = sbc.ToString();
      tb.CaretIndex = tb.Text.Length;
}