如何检查用户输入是否不是数字,然后在c#中显示消息?



所以这是我自己学习的第2天,我相信这是一个非常初学者的问题,但是在这里查找我使用typeof或tryparse发现的东西,但我似乎无法弄清楚如何使用它们。我可能不应该在学习的这个阶段尝试这个,但我想我还是要问一下,因为我真的很想知道怎么做。我正在遵循一个教程,但它不涉及如果用户输入不是一个数字。这是我的基本计算器:

using System;
namespace Tutorials
{
    class Program
    {
        static void Main(string[] args)
        {
            string opError = "Invalid Operator";
            string numError = "Enter a valid number";
            Console.Write("Enter a number: ");
            double num1 = Convert.ToDouble(Console.ReadLine());
            Console.Write("Enter Operator: ");
            string op = Console.ReadLine();
            Console.Write("Enter a number: ");
            double num2 = Convert.ToDouble(Console.ReadLine());

            if (op == "+")
            {
                Console.WriteLine(num1 + num2);
            }
            else if (op == "-")
            {
                Console.WriteLine(num1 - num2);
            }
            else if (op == "/")
            {
                Console.WriteLine(num1 / num2);
            }
            else if (op == "*")
            {
                Console.WriteLine(num1 * num2);
            }
            else
            {
                Console.WriteLine(opError);
            }
            Console.ReadLine();
        }

    }
}

我希望能够检查用户输入的num1和num2是否为数字,如果不是,我希望它显示我为numError设置的消息。现在if和else语句对我来说是有意义的,因为我知道使用的运算符。当涉及到用户输入时,它可以是任何东西。这就是我对如何做这件事感到困惑的地方。我读过typeof和tryparse,但我不太明白如何在这段代码中使用它们。我用tryparse试过了,但是一旦我输入一个数字,它什么都不做,所以我假设我需要一个if语句在里面,我还在开始的时候,不知道怎么做。用我的代码做这件事的最好方法是什么?我知道有更好的方法来做这个计算器,我已经看到了一些例子,但我正试图用我目前的方法来理解它。

一个解决方案是使用double.TryParse,它返回输入是否是有效数字,并且可以在do中使用。While循环如下:

double num1 = 0;
do {
    Console.WriteLine("Enter a number:");
} while(!double.TryParse(Console.ReadLine(), out num1));

告诉计算机继续提示用户输入,直到解析成功,即你得到一个有效的数字。

这个方法的一个问题是,它不告诉用户哪里出错了,只是继续输入数字。但它相对简单,你总是会在最后得到一个数字。


另一种使用double.TryParse和循环的方法是:

double num1 = 0;
while (true) {
    Console.WriteLine("Enter a number:");
    if (double.TryParse(Console.ReadLine(), out num1) {
        // if the parse was successful, we can break out of the loop
        break;
    } else {
        // if the parse was unsuccessful, display an error message and try again
        Console.WriteLine("Invalid number. Try again.");
    }
}

这个版本更复杂,但它告诉用户哪里出了问题,在我看来它更容易读,而且它也总是在最后得到一个数字。

编辑:添加了第二个版本-谢谢@Tomek

不要使用Convert.ToDouble(),它用于在数字类型之间转换,而是应该使用double.TryParse(),它将字符串解析为数字,如"1.234"1.234

见下面的示例

class Program
{
    static void Main(string[] args)
    {
        var input = Console.ReadLine();
        if (double.TryParse(input, out double value))
        {
            // use 'value'
        }
        else
        {
            Console.WriteLine("Please enter a valid number.");
        }
    }
}

用这个代替:

string c = Console.ReadLine();
int value;
if (int.TryParse(c, out value)) 
{ /* some code here */ }

正如你已经发现的,有很多方法可以解决这个问题。但是,如果您还没有准备好,我不建议您使用TryParse()之类的方法。

因为您将重点放在if-else语句上,我认为最好的解决方案是使用try和catch语句处理输入,因为它与if-else语句非常相似。

因此,您可能知道,如果尝试将字符串转换为数字数据类型(如int或double),将会得到错误。

int number = Convert.ToInt32("some text"); //this will cause an error

但实际上,这是一个完美的方法来找出输入的值是否是一个数字。现在,使用try-catch语句,您可以检测一条指令是否会导致错误,而不会导致程序崩溃。

try 
{ 
   //some code
}
catch 
{
   //this code will be executed when the code above would result in an error
}

也许你看到了if-else语句的一些相似之处。例如,如果try块中的代码导致错误,则执行catch块,否则执行try块本身。

因此,您可以尝试将用户输入转换为数字。如果输入是字符串,则可以使用catch语句输出错误消息:

string input = Console.Readline();
double number = 0;
double defaultValue = 1;
try
{
   number = Convert.ToDouble(input);
}
catch
{
   Console.WriteLine(numError);
   number = defaultValue;
}

例如,除了使用默认值,您还可以循环输入,直到用户输入一个有效的数字,或者只是结束程序,但我认为现在这就足够了=)

try and catch是非常有用的语句,以后你还会经常用到它们!

相关内容

  • 没有找到相关文章

最新更新