我有一个WPF应用程序,我在PreviewTextInput中有一个钩子,通过我得到当前输入的字符,我已经输入了字符串。鉴于此,我需要编写以下函数:
bool ShouldAccept(char newChar,string existingText)
existingText可以是逗号分隔的有效数字(包括指数),当按下无效字符时它应该返回false。
我的代码(如果基于其他代码)目前存在很多缺陷,我想知道是否有任何聪明的方法可以做到。
答案 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看起来像这样:
只需50行代码。我可以将所有正则表达式结合起来,但这更容易阅读。