【问题标题】:Parsing numbers at PreviewTextInput在 PreviewTextInput 解析数字
【发布时间】:2010-06-08 12:31:08
【问题描述】:

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

bool ShouldAccept(char newChar,string existingText)

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

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

【问题讨论】:

    标签: c# parsing numbers


    【解决方案1】:

    我建议分两次执行此操作:

    初查:判断新字符是否有效。您可能应该只接受数字、逗号、点、+- 标记和字母 e。每个其他字符都应该导致它返回 false

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

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

    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);`
    

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

    【讨论】:

    • 我喜欢你的 2 pass 解析器的想法,让我好好研究一下
    • @Nitin:如果您认为它解决了您的问题,请接受答案。如果您有任何其他问题,请随时提出,我很乐意提供帮助。干杯。
    • 当然,如果我没有得到更好的结果,我会将其标记为答案,我正在尝试另一种方法。一旦我有具体的实施,我会发布更多细节。因为我喜欢你的回答,所以我已经投票给你了。
    【解决方案2】:

    我终于用正则表达式做到了,

    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. 否则,如果输入为“,”,则将现有文本拆分为“,”并验证所有现有数字
    3. 对于所有其他输入,找出当前数字(可以是现有数字的编辑或上一个数字的延续),计算出来后,使用 newchar 验证数字

    总共只有 50 行代码。我本可以组合所有的正则表达式,但这更容易阅读。

    【讨论】:

    • 为什么不直接使用Double.TryParse
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2016-02-29
    相关资源
    最近更新 更多