首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >验证用户输入的十进制数

验证用户输入的十进制数
EN

Stack Overflow用户
提问于 2015-09-09 14:48:25
回答 4查看 12.9K关注 0票数 0

我有一个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

代码语言:javascript
运行
复制
<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#

代码语言:javascript
运行
复制
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,但我不能输入小数点。

如果我将下面的代码更改为下面的代码,则不会产生任何影响。

代码语言:javascript
运行
复制
Regex r = new Regex(@"^[0-9].");
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-09-09 14:58:04

类似于:

代码语言:javascript
运行
复制
Regex r = new Regex(@"^\d+\.?\d*$");

说明:"^“匹配字符串的开头;\d+匹配一个或多个数字…?匹配可选小数点,\d*匹配零或更多位数。"$“匹配字符串的末尾。

票数 1
EN

Stack Overflow用户

发布于 2015-09-09 15:05:24

regex ^[0-9].的意思是从字符串开始时就匹配范围0-9中的一个字符,然后匹配任意字符(.表示任意字符)。这不是你想要的。您需要匹配任意数量的字符,一个可选的小数点,然后再匹配更多的数字。类似于:

代码语言:javascript
运行
复制
^\d+\.?\d*$

它表示一个或多个(+)数字(\d等效于[0-9])、0或1 (?)小数点(必须转义.才能匹配文字. ( \.) ),然后是0或更多(*)数字。

这修复了您的正则表达式,但是在文本输入上这样做有点痛苦,您最好让用户输入文本,然后使用类似于decimal.TryParse的内容进行验证,而不是试图在用户输入文本时进行限制。为什么?考虑用户输入:

代码语言:javascript
运行
复制
1     // this is valid

然后:

代码语言:javascript
运行
复制
1.    // this is still valid

然后:

代码语言:javascript
运行
复制
1.2   // still valid

然后他们意识到他们指的是2.2,那么他们做什么呢?他们删除1以便:

代码语言:javascript
运行
复制
.2     // Buzzzz, not valid

这对用户来说真的很烦人。用户试图删除1,而控件顽固地拒绝更改。为什么?用户不知道。不要把输入用户的输入变成“猜猜规则是什么”的游戏。

另一件需要考虑的事情是,并非所有的文化都使用.作为小数分隔符,这对您来说可能是一个问题,也可能不是一个问题。实际上是世界上的大多数人

因此,不要取消文本条目,使用TryParse (具有适当的文化设置)并在TextBox上设置一个错误,而不是停止用户输入文本。只是不要让用户进入下一个阶段,直到他们解决了数字条目的问题。

票数 5
EN

Stack Overflow用户

发布于 2015-09-09 15:07:36

正则表达式可能不是这样做的最可读/最可维护的方式。

试着解析它;

代码语言:javascript
运行
复制
private bool IsNumeric(string s) => decimal.TryParse(s, out var value);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32482771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档