当我输入字母而不是变量时,我的简单计算器程序在C#中出现问题

当我输入字母而不是变量时,我的简单计算器程序在C#中出现问题,c#,calculator,letters-and-numbers,C#,Calculator,Letters And Numbers,例如,当我的程序要求输入一个数字,我输入一个字母时,程序退出。那么,当输入一封信时,我怎么能让它什么也不做呢? 我在“int”或“strings”中看到过这种情况,但在“double”中没有看到。这真的让我很难受,我也不太明白这些问题是如何解决的 static void Main(string[] args) { Console.WriteLine("type 'Exit' to leave this program."); Console.ReadLi

例如,当我的程序要求输入一个数字,我输入一个字母时,程序退出。那么,当输入一封信时,我怎么能让它什么也不做呢? 我在“int”或“strings”中看到过这种情况,但在“double”中没有看到。这真的让我很难受,我也不太明白这些问题是如何解决的

 static void Main(string[] args)
    {
        Console.WriteLine("type 'Exit' to leave this program.");
        Console.ReadLine();
        Console.Clear(); 
    Valuechoice: Console.WriteLine("Please choose a number.");
        double value1 = Convert.ToDouble(Console.ReadLine());     
        Console.WriteLine("Please choose a second Number.");
        double value2 = Convert.ToDouble(Console.ReadLine());
        Console.WriteLine("What would you like to do to these numbeers?");
        Console.WriteLine("Multiply");
        Console.WriteLine("Divide");
        Console.WriteLine("Add");
        Console.WriteLine("subtract");
        string operation = Console.ReadLine();
        Console.WriteLine();
        Console.Clear();
        if (operation == "Multiply")
        {
            double total1;
            total1 = (value1 * value2);
            Console.WriteLine(total1);
            Console.ReadLine();
            Console.Clear();
            goto Valuechoice;
        }
        if (operation == "Divide")
        {
            double total2;
            total2 = (value1 / value2);
            Console.WriteLine(total2);
            Console.ReadLine();
            Console.Clear();
            goto Valuechoice;
        }
        if (operation == "Add")
        {
            double total3;
            total3 = (value1 + value2);
            Console.WriteLine(total3);
            Console.ReadLine();
            Console.Clear();
            goto Valuechoice;

        }
        if (operation == "Subtract")
        {
            double total4;
            total4 = (value1 - value2);
            Console.WriteLine(total4);
            Console.ReadLine();
            Console.Clear();
            goto Valuechoice;

        }
        if (Console.ReadLine() == "Exit")
        {
            Environment.Exit(0);
        }
如果输入不是有效的double,将抛出
FormatException
。改用

例如,您可以这样做,不断向用户询问有效号码:

double value1;

while(!double.TryParse(Console.ReadLine(), out value1)) 
{
    Console.WriteLine("Please choose a valid number");
}

此外,这里也没有理由使用
goto
。我建议重新构造您的程序,改为使用循环。

使用
TryParse
-类似以下内容:

double value1;
while (!double.TryParse(Console.ReadLine(), out value1) {
  Console.WriteLine("Please enter a valid number");
}
bool valid = true; // locally declared variable, this is important!

string value = Console.ReadLine();
valid = validateInput(value);

if (valid == true) {
double value1 = Convert.ToDouble(value);
// Proceed with calculations, etc
}

private bool validateInput(string value) {
bool valid = true;
foreach (char c in value)
    {
        if (char.IsLetter(c))
            valid = false;
        Console.WriteLine("Input is invalid!");
    }
return valid;
}

不能将字母转换为双精度数字。这就像说把“e”变成小数点34.72。这是不可能的

试着这样做:

double value1;
while (!double.TryParse(Console.ReadLine(), out value1) {
  Console.WriteLine("Please enter a valid number");
}
bool valid = true; // locally declared variable, this is important!

string value = Console.ReadLine();
valid = validateInput(value);

if (valid == true) {
double value1 = Convert.ToDouble(value);
// Proceed with calculations, etc
}

private bool validateInput(string value) {
bool valid = true;
foreach (char c in value)
    {
        if (char.IsLetter(c))
            valid = false;
        Console.WriteLine("Input is invalid!");
    }
return valid;
}

只需将用户输入的内容读取为
字符串
,然后在尝试将其转换为
Double
之前确定它是否为字母。这个问题实在是太本地化了。你最好用更一般的形式来表述你的问题。你也可以抓住Convert.ToDouble.Thank引发的异常。它的工作方式很有魅力。你能解释一下如何使用环路吗?我只是在学习如何编程。@TheMyQuin:非常好——基本上它只是在块内重复代码,直到括号内的条件为false。