测试以确保用户输入是双倍且大于零?

时间:2016-05-28 16:02:52

标签: c# parsing while-loop user-input

在C#中,我试图让用户输入一个数字。然后我想检查一下

  1. 他们输入了一个可以转换为double和
  2. 的字符串
  3. 他们输入的值大于零
  4. 我最初创建的方法是

    string inValue;
    double outcome;
    
    Console.WriteLine("Enter amount: ");
    inValue = Console.ReadLine();
    while (double.TryParse(inValue, out outcome) == false)
    {
        Console.WriteLine("Initial value must be of the type double");
        Console.WriteLine("\nPlease enter the number again: ");
        inValue = Console.ReadLine();
    }
    outcome = double.Parse(inValue);
    while (outcome < 0)
    {
        Console.WriteLine("Initial value must be of at least a value of zero");
        Console.WriteLine("\nPlease enter the number again: ");
        inValue = Console.ReadLine();
        outcome = double.Parse(inValue);
    }
    return outcome;
    

    问题是,如果用户输入说“-10”然后“f”则会发生异常。这是因为程序将超过第一次检查(检查双精度)的值为-10,但是当输入“f”时,它仅在给出第二次测试时抛出异常。

    我认为解决方案是创建一个while语句,该语句在无法将值转换为double或将值转换为double且低于零时写入错误语句。我不知道该怎么做是将值转换为double,然后在while语句中将其计算为大于零。

4 个答案:

答案 0 :(得分:7)

你走在正确的轨道上 - 你需要有一个while循环来获取输入然后尝试两个验证。一种方法是创建一个布尔值来跟踪值是否有效,然后将其用作循环的条件:

double outcome = 0;
bool valid = false;

while (!valid)
{
    Console.WriteLine("Enter amount: ");
    string inValue = Console.ReadLine();
    if (double.TryParse(inValue, out outcome) == false)
    {
        Console.WriteLine("Initial value must be of the type double");
        Console.WriteLine("\nPlease enter the number again: ");
    }
    else if (outcome < 0)
    {
        Console.WriteLine("Initial value must be of at least a value of zero");
        Console.WriteLine("\nPlease enter the number again: ");
    }
    else
    {
        valid = true;
    }
}
return outcome;

也可以将两个条件放在while语句中,但是这种方法可以根据哪些条件失败提供不同的消息。

答案 1 :(得分:6)

你可以在你的第一个while循环中使用这两个条件

类似

while (!double.TryParse(inValue, out outcome) || outcome < 0)
{
    ...
}

一些解释:double.TryParse如果成功则会修改结果的值,所以如果它能够解析那么! TryParse将被评估为false,因此我们进入第二部分并评估结果&lt; 0

答案 2 :(得分:2)

我会选择这样的解决方案。只需注意在完成double.Parse(Value)之后您没有double.TryParse(value, out outcome) out参数将在TryParse为真时填充该变量。

您可以将以下代码复制并粘贴到LinqPad并使用它。但这可以满足您的需求。

void Main()
{
    var result = DoWork();
    Console.WriteLine(result);
}

public double DoWork()
{
    string inValue;
    double outcome;

    Console.WriteLine("Enter amount: ");
    inValue = Console.ReadLine();
    while (!double.TryParse(inValue, out outcome) || outcome <= 0)
    {
        Console.WriteLine("Initial value must be of the type double and greater than 0");
        Console.WriteLine("\nPlease enter the number again: ");
        inValue = Console.ReadLine();
    }
    return outcome;
}

答案 3 :(得分:0)

经过一点重新组合后,它正在运行代码! 但我认为你有时需要使用if而不是while

    string inValue = "";
    double outcome = -1;

    Console.WriteLine("Enter amount: ");
    while (outcome < 0){
      inValue = Console.ReadLine();

      if (double.TryParse(inValue, out outcome) == false)
      {
        Console.WriteLine("Initial value must be of the type double");
        Console.WriteLine("\nPlease enter the number again: ");
        continue;
      }
      if (outcome>=0) {continue;}
      Console.WriteLine("Initial value must be of at least a value of zero");
      Console.WriteLine("\nPlease enter the number again: ");
    }
    return outcome;