【问题标题】:Regex C# console app正则表达式 C# 控制台应用程序
【发布时间】:2012-03-25 09:37:02
【问题描述】:

如何添加一个接受小数位 (5.23) 的正则表达式,但在这样的中断中没有其他内容?即只处理数字和小数位,如果输入或返回除此之外的任何内容,则会引发错误:

    case 1:
    double[] myArrai1 = new double[3];
    Console.WriteLine("Insert a number");
    myArrai1[0] = double.TryParse(Console.ReadLine()); // no overload method?
     Console.WriteLine("Insert a number");
     myArrai1[1] = double.Parse(Console.ReadLine());
    Console.WriteLine("Insert a number");
    myArrai1[2] = double.Parse(Console.ReadLine());
    break;

干杯,伙计们。

P.s 不确定如何在 break 中对其进行编程也必须毫无例外。

【问题讨论】:

    标签: c# regex error-handling


    【解决方案1】:

    正则表达式对于验证double 有点繁重。请改用double.TryParse(如果输入无效,它将返回false)。

    double dbl;
    if (!double.TryParse(Console.ReadLine(), out dbl))
        Console.WriteLine("Invalid input");
    

    【讨论】:

    • Badcock 这引发了一个异常 我很早就感到困惑 我需要处理错误,很快用户点击返回一个错误显示在控制台中,说他们输入了错误的字符,只允许数字。对不起,我很累,这是一个沉重的一天。
    • 是的,这种方法由于某种原因不起作用?如果我将它封装在第一个插入中,我会立即得到一个无效的输入,如果它把它放在底部并点击一个字母并返回我仍然会得到一个异常?
    • 猜测:CultureInfo 可能也很有价值,也许只是调试它并查看传入的值会有所帮助。最后你的问题在这里得到了回答。
    【解决方案2】:

    您不需要Regex

    您可以简单地使用decimal.Parsedouble.Parse - 如果输入字符串格式错误,您将得到FormatException

    您发布的代码似乎是正确的 - 什么不起作用?

    【讨论】:

    • decimal.TryParse 是一种替代方法,用于验证是否可以在不需要使用异常的情况下对其进行解析。
    • @Servy - 是的,但我不清楚是否需要例外。
    • @MattBurland - 不,它是不同的。它取决于想要的行为。如果你想要一个例外,TryParse不是更好。
    • @Oded 这就是为什么我提到了替代方案,而不是更正。让 OP 决定哪个是合适的。
    • @Garrith - M.Babcock 在他的answer 中添加了一个示例。
    【解决方案3】:

    试试这个:

    /^\d+(\.\d{1,2})?$/;
    
       Regex regex = new Regex ("^\d+(\.\d{1,2})?$");
        MatchCollection matches = regex.Matches(text);
         if (matches.Count>0)......
    

    【讨论】:

    • +1 表示正则表达式,OP 也可能不应该用一个开头。
    【解决方案4】:

    使用 .NET 的双重解析而不是尝试在 Regex 中重新发明它可能会更好。您可以使用 Double.TryParse 来测试字符串,如果可以解析数字并进行转换:

     Console.WriteLine("Insert a number");
     string input = Console.ReadLine();
     double value;
     if (!Double.TryParse(input, NumberStyles.Any, CultureInfo.InvariantCulture, out value)) 
        throw new InvalidOperationException(String.Format("{0} could not be parsed as a valid number.", input));
    

    【讨论】:

    • 那太重了,我每次插入都不需要这样做吗?
    • 如果你还是要抛出异常,那为什么还要麻烦TryParse
    • @Garrith 这就是方法的用途,这样您就不需要一遍又一遍地重复相同的代码。创建一个方法GetDoubleFromUser(),它返回一个双精度并包含或多或少像这样的代码(但有一个返回)。
    【解决方案5】:

    您是只想验证用户输入的内容,还是一开始就阻止他们输入无效字符?

    在第一种情况下,并不需要正则表达式。您在 double.Parse 的正确轨道上,但您想要做的是 double.TryParse。首先将用户输入读入字符串,然后 TryParse 将其转换为双精度。如果 TryParse 返回 false,告诉您用户他们的输入无效并提示他们再次输入。

    FWIW:我会这样做(警告:未经测试的代码),这可能是您需要的,也可能不是:

    case 1:
    double[] myArrai1 = new double[3];
    for (int i=0; i < myArrai1.length; i++) {
        Console.WriteLine("Insert a number");
        while (!double.TryParse(Console.Readline(), out myArrai1[i])) {
            Console.WriteLine("Invalid entry. Please enter a number.");
        }
    }
    break;
    

    【讨论】:

    • myArrai1[0] = double.TryParse(Console.ReadLine());没有给出尝试解析的重载方法?
    • @Garrith 你可以google double.TryParse 查看方法的签名及其使用示例。
    • 阅读 MSDN 文档。您需要将 double 作为 out 参数传递。 driis 的回答几乎是正确的。
    猜你喜欢
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多