在PreviewTextInput中解析数字

时间:2010-06-08 12:31:09

标签: c# parsing numbers

我有一个WPF应用程序,我在PreviewTextInput中有一个钩子,通过我得到当前输入的字符,我已经输入了字符串。鉴于此,我需要编写以下函数:

bool ShouldAccept(char newChar,string existingText)

existingText可以是逗号分隔的有效数字(包括指数),当按下无效字符时它应该返回false。

我的代码(如果基于其他代码)目前存在很多缺陷,我想知道是否有任何聪明的方法可以做到。

2 个答案:

答案 0 :(得分:2)

我建议两个人做这件事:

首先检查:查找新字符是否有效。你可能应该只接受数字,逗号,点,+ - 标记和字母e。每个其他角色都应该导致它返回false

第二次检查:将新字符附加到字符串,使用split method将其拆分为逗号,并为每个单独的字符串执行float / double中的TryParse方法。您可能应该以不同方式处理分割元素中的最后一个字符串,因为输入仍然在进行中(即不会解析以dot结尾的字符串。

请记住,您需要“告诉”解析器,允许使用点和其他字符以及如何处理它们。对我来说,以下设置工作正常:

System.Globalization.CultureInfo info = new System.Globalization.CultureInfo("en-GB");
System.Globalization.NumberStyles styl = System.Globalization.NumberStyles.AllowDecimalPoint;
double.TryParse(someString, styl, info, out number);`

还有一件事:如果可以,请将分隔标记从逗号更改为分号。某些文化中的逗号用于表示小数点。

答案 1 :(得分:1)

我终于使用Regex做了它,

private readonly List<Regex> ValidNumberRegex = new List<Regex>
                                {
                                    new Regex(@"^-?$"),
                                    new Regex(@"^-?\d+$"),
                                    new Regex(@"^-?\d+\.$"),
                                    new Regex(@"^-?\d+\.\d+$"),
                                    new Regex(@"^-?\d+\.\d+[eE]$"),
                                    new Regex(@"^-?\d+\.\d+[eE]-?$"),
                                    new Regex(@"^-?\d+\.\d+[eE]-?\d+$"),
                                    new Regex(@"^-?\d+[eE]-?$"),
                                    new Regex(@"^-?\d+[eE]-?\d+$"),
                                };

所以基本上我的ShouldAccept看起来像这样:

  1. 如果输入是第一个字符,则只允许“ - ”或0-9
  2. 否则,如果输入为“,”则将existingText拆分为“,”并验证所有现有数字
  3. 对于所有其他输入,找出当前数字(可以是现有数字的编辑或最后一个数字的继续),在计算出来之后,使用newchar验证数字
  4. 只需50行代码。我可以将所有正则表达式结合起来,但这更容易阅读。