解析文本时发生System.FormatException

问题描述:

我是新来的C#,所以请善待。我正在为我的编程课程进行任务,并且不能在我的生活中找出问题所在。该程序是一个计算器,它接受来自两个文本框的输入并对其进行操作,并禁用第二个文本框并使用按钮输入数字(数字键盘)。我正在使用Visual Studio 2013,并多次遍历我的代码并逐步完成。这里是我的代码:解析文本时发生System.FormatException

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并给出错误。

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

谢谢, 克里斯

你这样做:

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

您检查之前inputOne或inputTwo的内容是否为空或不。如果其中任一个为空或者包含不能被解析为双精度的字符串,则解析线会抛出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 } 

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

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

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

你在这里做这个

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 != "")) 

您已经证实,这两个文本框填写,那么这将永远是true,所以只是一个简单的其他就足够了。

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();