验证十进制数的用户输入

时间:2015-09-09 14:48:25

标签: c# regex wpf

我有一个wpf文本框,我想检查用户输入它们只使用0 1 2 3 4 5 6 7 8 9。十进制数的[小数点]字符。我使用此文本框稍后转换为小数

我使用以下文章作为起点 Regex Match Preview Text Input example regex-to-allow-one-decimal-number-or-a-range-of-decimal-number

这是我的xaml

<TextBox Grid.Column="1" Height="28" HorizontalAlignment="Left" Margin="10,10,0,0" Name="tbTaxFreeLimit" Width="90" VerticalAlignment="Top" 
                                             AcceptsTab="True" 
                                             PreviewTextInput="tbDecimalCheck_PreviewTextInput"
                                            />

和c#

private void tbDecimalCheck_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
     // Test for decimal
     if (IsNumeric(e.Text)==false)
         e.Handled = true;
}

private bool IsNumeric(string s)
{
    Regex r = new Regex(@"^[0-9]");

    return r.IsMatch(s);
}

此示例适用于0 1 2 3 4 5 6 7 8 9,但我无法输入小数点。

如果我将以下代码更改为以下代码,则无效

Regex r = new Regex(@"^[0-9].");

3 个答案:

答案 0 :(得分:4)

您的正则表达式^[0-9].从字符串匹配开始就说明0-9范围内的一个字符,然后匹配任何字符(.表示任何字符)。这不是你想要的。您需要匹配任意数量的字符,可选的小数点,然后是更多的数字。类似的东西:

^\d+\.?\d*$

其中一个或多个(+)数字(\d相当于[0-9]),0或1(?)小数点({{1}必须转义以匹配文字.,因此.),然后匹配0或更多(\.)个数字。

这可以修复你的正则表达式,但是在文本输入上执行此操作会很麻烦,最好让用户输入文本,然后使用类似*的内容进行验证,而不是在键入时尝试限制。为什么?考虑用户输入:

decimal.TryParse

然后:

1     // this is valid

然后:

1.    // this is still valid

然后他们意识到他们的意思是1.2 // still valid ,那么他们做了什么?他们会删除2.2以提供:

1

这对用户来说真的很烦人。用户尝试删除.2 // Buzzzz, not valid ,控件顽固地拒绝更改。为什么?用户不知道。不要将用户输入输入游戏中,猜测规则是什么&#34;。

要考虑的另一件事,可能是也可能不是您的问题,并非所有文化都使用1作为小数分隔符。事实上most of the world doesn't

因此,请勿取消文字输入,使用.(使用适当的文化设置),只需在TryParse上设置错误,而不是停止用户输入文字。在用数字输入解决问题之前,不要让用户进入下一阶段。

答案 1 :(得分:3)

正则表达式可能不是最易读/可维护的方法。

尝试解析它;

private bool IsNumeric(string s) => decimal.TryParse(s, out var value);

答案 2 :(得分:0)

System.Text.RegularExpressions.Regex.IsMatch(txtTransactionAmount.Text, @"[^0-9].[^0-9]")
相关问题