我有一个wpf文本框,我想在用户输入时检查它们是否只使用0 1 2 3 4 5 6 7 8 9。十进制数字的小数点字符。稍后,我使用此文本框将其转换为十进制。
我使用以下文章作为Regex匹配 预览文本输入示例 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].");发布于 2015-09-09 14:58:04
类似于:
Regex r = new Regex(@"^\d+\.?\d*$");说明:"^“匹配字符串的开头;\d+匹配一个或多个数字…?匹配可选小数点,\d*匹配零或更多位数。"$“匹配字符串的末尾。
发布于 2015-09-09 15:05:24
regex ^[0-9].的意思是从字符串开始时就匹配范围0-9中的一个字符,然后匹配任意字符(.表示任意字符)。这不是你想要的。您需要匹配任意数量的字符,一个可选的小数点,然后再匹配更多的数字。类似于:
^\d+\.?\d*$它表示一个或多个(+)数字(\d等效于[0-9])、0或1 (?)小数点(必须转义.才能匹配文字. ( \.) ),然后是0或更多(*)数字。
这修复了您的正则表达式,但是在文本输入上这样做有点痛苦,您最好让用户输入文本,然后使用类似于decimal.TryParse的内容进行验证,而不是试图在用户输入文本时进行限制。为什么?考虑用户输入:
1 // this is valid然后:
1. // this is still valid然后:
1.2 // still valid然后他们意识到他们指的是2.2,那么他们做什么呢?他们删除1以便:
.2 // Buzzzz, not valid这对用户来说真的很烦人。用户试图删除1,而控件顽固地拒绝更改。为什么?用户不知道。不要把输入用户的输入变成“猜猜规则是什么”的游戏。
另一件需要考虑的事情是,并非所有的文化都使用.作为小数分隔符,这对您来说可能是一个问题,也可能不是一个问题。实际上是世界上的大多数人。
因此,不要取消文本条目,使用TryParse (具有适当的文化设置)并在TextBox上设置一个错误,而不是停止用户输入文本。只是不要让用户进入下一个阶段,直到他们解决了数字条目的问题。
发布于 2015-09-09 15:07:36
正则表达式可能不是这样做的最可读/最可维护的方式。
试着解析它;
private bool IsNumeric(string s) => decimal.TryParse(s, out var value);https://stackoverflow.com/questions/32482771
复制相似问题