Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C计算器“输入字符串的格式不正确”,除了加法之外的所有操作_C# - Fatal编程技术网

C# C计算器“输入字符串的格式不正确”,除了加法之外的所有操作

C# C计算器“输入字符串的格式不正确”,除了加法之外的所有操作,c#,C#,我试着创建一个小计算器,一切都很好。我可以做每一个操作都不会出错。然后我试着改进一些东西,增加一些。 突然,原来的部分不再工作,我得到了错误:[System.FormatException:输入字符串的格式不正确。]每次我尝试减法、乘法或除法时 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Syste

我试着创建一个小计算器,一切都很好。我可以做每一个操作都不会出错。然后我试着改进一些东西,增加一些。 突然,原来的部分不再工作,我得到了错误:[System.FormatException:输入字符串的格式不正确。]每次我尝试减法、乘法或除法时

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Calculator_V2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void OnKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                answer.Text = Calculate(textBox.Text);
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            string s_button = sender.ToString();
            textBox.Text = textBox.Text + s_button.Substring(s_button.Length - 1);
        }


        public string Calculate(string text)
        {
            double finalAnswer = AddAndSubstract(text);

            return finalAnswer.ToString();


        }
        public double AddAndSubstract(string text1)
        {
            string[] text = text1.Split('-');
            List<string> textList = new List<string>();

            for (int i = 0; i < text.Length; i++)
            {
                textList.Add(text[i]);
                if (i != text.Length - 1)
                {
                    textList.Add("-");
                }
                textList.Add("-");
            }

            for (int i = 0; i < textList.Count; i++)
            {
                if (textList[i].Contains('+') && textList[i].Length > 1)
                {

                    string[] testPart = textList[i].Split('+');

                    textList.RemoveAt(i);

                    for (int j = testPart.Length - 1; j >= 0; j--)
                    {
                        textList.Insert(i, testPart[j]);
                        if (j != 0)
                        {
                            textList.Insert(i, "+");
                        }

                    }
                }

            }
            double total;
            if (textList[0].Contains("*") || textList[0].Contains("/"))
            {
                total = DivideAndMultiply(textList[0]);
                return total;
            }
            else
            {
                total = Convert.ToDouble(textList[0]);


                for (int i = 2; i < textList.Count; i += 2)
                {
                    if (textList[i - 1] == "-")
                    {
                        total = total - DivideAndMultiply(textList[i]);
                    }
                    else if (textList[i - 1] == "+")
                    {
                        total = total + DivideAndMultiply(textList[i]);
                    }


                }


                return total;
            }
        }

        public double DivideAndMultiply(string text1)
        {
            string[] text = text1.Split('*');
            List<string> textList = new List<string>();

            for (int i = 0; i < text.Length; i++)
            {
                textList.Add(text[i]);
                if (i != text.Length - 1)
                {
                    textList.Add("*");
                }
                textList.Add("*");
            }

            for (int i = 0; i < textList.Count; i++)
            {
                if (textList[i].Contains('/') && textList[i].Length > 1)
                {

                    string[] testPart = textList[i].Split('/');

                    textList.RemoveAt(i);

                    for (int j = testPart.Length - 1; j >= 0; j--)
                    {
                        textList.Insert(i, testPart[j]);
                        if (j != 0)
                        {
                            textList.Insert(i, "/");
                        }

                    }
                }

            }


            double total = Convert.ToDouble(textList[0]);

            for (int i = 2; i < textList.Count; i += 2)
            {
                if (textList[i - 1] == "/")
                {
                    total = total / Convert.ToDouble(textList[i]);
                }
                else if (textList[i - 1] == "*")
                {
                    total = total * Convert.ToDouble(textList[i]);
                }


            }


            return total;

        }



        private void Button_Click_C(object sender, RoutedEventArgs e)
        {
            double finalAnswer = 0;

            answer.Text = "";
            textBox.Text = "";
        }

        private void Button_Click_zahl(object sender, RoutedEventArgs e)
        {
            string s_button = sender.ToString();
            textBox.Text = textBox.Text + s_button.Substring(s_button.Length - 1);

        }

        private void Button_Click_equals(object sender, RoutedEventArgs e)
        {


                answer.Text = RemoveBrackets(textBox.Text);




        }

        public string RemoveBrackets(string text)
        {
            while (text.Contains('(') && text.Contains(')'))
            {
                int openIndex = 0;
                int closeIndex = 0;

                for (int i = 0; i < text.Length; i++)
                {
                    if (text[i] == '(')
                    {
                        openIndex = i;
                    }

                    if (text[i] == ')')
                    {
                        closeIndex = i;

                        text = text.Remove(openIndex,closeIndex-openIndex +1).Insert(openIndex,ResolveBrackets(openIndex, closeIndex, text));

                        break;
                    }
                }
            }



            for (int i = 1; i < text.Length; i++)
            {
                if (text[i] == '-' && (text[i]-1=='*' || text[i] - 1 == '/'))
                {
                    for (int j=i-1; j>=0; j++)
                    {
                        if (text[j] == '+')
                        {
                            StringBuilder text1 = new StringBuilder(text);
                            text1[j] = '-';
                            text = text1.ToString();
                            text = text.Remove(i, 1);
                            break;
                        }
                        else if (text[j] == '-')
                        {
                            StringBuilder text1 = new StringBuilder(text);
                            text1[j] = '+';
                            text = text1.ToString();
                            text = text.Remove(i, 1);
                            break;
                        }
                    }

                }
            }

            if (text[0] == '-') //für Fehler wenn - als erste Ziffer
            {
                text = '0' + text;
            }
            return Calculate(text);
        }

        public string ResolveBrackets(int openIndex, int closeIndex, string text)
        {
            string bracketAnswer = Calculate(text.Substring(openIndex +1, closeIndex -1));

            return bracketAnswer;
        }
    }


}

因为你可能会加两次减号

            if (i != text.Length - 1)
            {
                textList.Add("-");
            }
            textList.Add("-");
然后,当您在第2步中循环时

for (int i = 2; i < textList.Count; i += 2)
你不再有[号码][签名][号码][签名]


我建议您查看列表中的项目以了解问题所在。我还建议您将逻辑划分为更小的方法,这些方法可以单独测试。

我认为问题在于您使用了

double total = Convert.ToDouble(textList[0]);
除乘


首先,最好使用string.IsNullOrEmptytextList[0]测试字符串是null还是空;并使用Double.TryParse而不是convert。

您的问题中有大量代码。错误发生在哪里?哪一行引发异常?当时每个相关变量的运行时值是多少?基本上,您试图将什么字符串值转换为什么其他数据类型?这已经做了无数次了。为什么你要尝试重新发明轮子,而不是使用预先制作/记录/错误验证的东西?@frank显然是为了学习的目的……这是学习内置调试器的好机会。