【问题标题】:WPF Filter Textbox Input with Decimals C#WPF过滤带有小数的文本框输入C#
【发布时间】:2017-01-05 16:12:25
【问题描述】:

我已使用以下代码成功过滤掉除数字之外的任何内容。我已经利用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+)?$

对我接下来应该尝试什么有什么建议吗?

【问题讨论】:

标签: c# regex wpf


【解决方案1】:

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

  • 如果第一个字符是.,它将自动更改为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;
}

【讨论】:

    猜你喜欢
    • 2021-11-02
    • 2019-12-11
    • 2011-04-13
    • 2019-07-16
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多