解析文本时发生System.FormatException

时间:2015-03-18 23:21:38

标签: c# exception formatexception

我是新来的,也是C#的新手,所以请善待。我正处于编程课程的任务中,并且在我的生活中无法找出问题所在。该程序是一个计算器,它从两个文本框中获取输入并对它们进行操作,并禁用第二个文本框并使用按钮输入数字(数字键盘)。我正在使用Visual Studio 2013并且已经多次查看我的代码并逐步完成它。这是我的代码:

    static int checkFocusedTextbox = 1;
    string operationPerformed;
    double result = 0;

    private void Operator_Click(object sender, RoutedEventArgs e)
    {
       // try
      //  {
            Button button = (Button)sender;
            operationPerformed = button.Content.ToString();
            double num1 = double.Parse(inputOne.Text);
            double num2 = double.Parse(inputTwo.Text);

            if (checkFocusedTextbox == 1)
            {
                if ((inputOne.Text == "") || (inputTwo.Text == ""))
                {
                    error.Text = "Please fill both text fields";
                }
                else if ((inputOne.Text != "") || (inputTwo.Text != ""))
                {
                    switch ((string)button.Tag)
                    {
                        case "+":
                            inputOne.Clear();
                            inputTwo.Focus();
                            result = num1 + num2;
                            break;
                        case "-":
                            inputOne.Clear();
                            num2 = double.Parse(inputOne.Text);
                            result = num1 + num2;
                            break;
                        case "*":
                            inputOne.Clear();
                            num2 = double.Parse(inputOne.Text);
                            result = num1 + num2;
                            break;
                        case "/":
                            inputOne.Clear();
                            num2 = double.Parse(inputOne.Text);
                            result = num1 / num2;
                            break;
                        case "%":
                            inputOne.Clear();
                            num2 = double.Parse(inputOne.Text);
                            result = num1 % num2;
                            break;
                        default:
                            break;
                    }
                    output.Text = result.ToString();
                }
            }
            else
            {
                Calculation(num1, num2);
                output.Text = result.ToString();
            }
    }

    public void Calculation(double number1, double number2)
    {
        switch (operationPerformed)
        {
            case "+":
                result = number1 + number2;
                break;
            case "-":
                result = number1 - number2;
                break;
            case "*":
                result = number1 * number2;
                break;
            case "/":
                result = number1 / number2;
                break;
            case "%":
                result = number1 % number2;
                break;
            default:
                break;
        }
    }

    public void CalculationNumberpad()
    {

    }

    private void NumberPad_Click(object sender, RoutedEventArgs e)
    {
        Button button = (Button)sender;
        inputOne.Text += button.Content.ToString();
    }

    private void inputTwo_GotFocus(object sender, RoutedEventArgs e)
    {
        checkFocusedTextbox = 2;
    }

    private void inputOne_GotFocus(object sender, RoutedEventArgs e)
    {
        checkFocusedTextbox = 1;
    }
}

}

Button类成功检索按钮单击并进入operationPerformed变量。这已经在我的代码的顶部声明为一个字符串,所以我无法理解为什么我得到一个错误,因为我使用ToString()。然后它进入num1 double并给我错误。

我迫切需要帮助,我知道这个社区是最好的!如果我遗漏了任何信息,请原谅我。

谢谢, 克里斯

3 个答案:

答案 0 :(得分:0)

你这样做:

   double num1 = double.Parse(inputOne.Text);
   double num2 = double.Parse(inputTwo.Text);

在检查inputOne或inputTwo的内容是否为空之前。如果其中一个为空或包含无法解析为double的字符串,则Parse行将抛出System.FormatException。

查看double.TryParse以检查某些内容是否可解析而不会抛出异常。如下所示:

double num1, num2;
if (double.TryParse(inputOne.Text, out num1) && double.TryParse(inputTwo.Text, out num2))
{ ... values are valid, so do things}
else
{ ... at least one value is not valid... warn user }

答案 1 :(得分:0)

这些条件错了: (inputOne.Text!=“”)|| (inputTwo.Text!=“”)

测试字符串是否相等使用str1.Equals(str2); 也与A ||相反B是!A&& !乙

更好的测试是string.IsNullorEmpty(teststring);

答案 2 :(得分:0)

您正在执行此操作

inputOne.Clear();   // this makes the TextBox empty

然后这个

num2 = double.Parse(inputOne.Text);   // How can you parse an empty text

一样改变
case "-":
    num2 = double.Parse(inputOne.Text);  // First take the value
    inputOne.Clear();                    // Then clear
    result = num1 + num2;                // Then Calculate
    break;

此处进行比较

else if ((inputOne.Text != "") || (inputTwo.Text != ""))

您已经确认两个文本框都已填充,然后这将始终为真,因此只需一个简单的其他即可。

替换该行
else   // that's enough

从此处按钮获取操作员标志

switch ((string)button.Tag)

它不是您需要的标记。您需要的是按钮的内容

将其更改为

switch ((string)button.Content.ToString())

你将如何填充inputTwo TextBox?

Button button = (Button)sender;
inputOne.Text += button.Content.ToString();

这里你只能选择填写inputOne

如此改变

Button button = (Button)sender;
if (checkFocusedTextbox == 1)
     inputOne.Text += button.Content.ToString();
 else
     inputTwo.Text += button.Content.ToString();