如何以编程方式将字符串转换为数学表达式

时间:2014-02-13 09:58:54

标签: c# math expression formula

我是C#的初学者。我在将字符串转换为数学表达式时遇到问题。我有一个UI,用户可以使用随机公式字段创建公式。在另一个UI中,用户将提供这些公式字段的输入。

例如,首次公式可能为(a+b)^n而另一公式可能为((a+b+c)^n+b)

在我的计算用户界面中,用户首次为a,b,n输入输入,对于第二个公式,用户将为a,b,c,n输入。任何人都可以帮助我如何获得这两个方案的程序性结果?提前致谢

5 个答案:

答案 0 :(得分:1)

我认为这是解决方案

 Expression e = new Expression("((a+b+c)^n+b)");
 e.Evaluate();

答案 1 :(得分:1)

这是应该做的:

string formula = "type your formula here"; //or get it from DB
StringToFormula stf = new StringToFormula();
double result = stf.Eval(formula);

像这样调用类和方法:

Directory.GetCurrentDirectory();

答案 2 :(得分:0)

有很多公式评估方法, take a look.只需接受您的输入,将字符串中的abn字符替换为用户提供的值,并使用上述方法之一解析方程式。

答案 3 :(得分:0)

string input= "(12 + 4 * 6) * ((2 + 3 * ( 4 + 2 ) ) ( 5 + 12 ))";       
    string str4 = "(" + input`enter code here`.Replace(" ", "") + ")";
            str4 = str4.Replace(")(", ")*(");
            while (str4.Contains('('))
            {
                string sub1 = str4.Substring(str4.LastIndexOf("(") + 1);
                string sub = sub1.Substring(0, sub1.IndexOf(")"));
                string sub2 = sub;
                string str21 = sub2.Replace("^", "~^~").Replace("/", "~/~").Replace("*", "~*~").Replace("+", "~+~").Replace("-", "~-~");
                List<string> str31 = str21.Split('~').ToList();
                while (str31.Count > 1)
                {
                    while (str31.Contains("*"))
                    {
                        for (int i = 0; i < str31.Count; i++)
                        {
                            if (str31[i] == "*")
                            {
                                val = Convert.ToDouble(str31[i - 1]) * Convert.ToDouble(str31[i + 1]);
                                str31.RemoveRange(i - 1, 3);
                                str31.Insert(i - 1, val.ToString());
                            }
                        }
                    }
                    while (str31.Contains("/"))
                    {
                        for (int i = 0; i < str31.Count; i++)
                        {
                            if (str31[i] == "/")
                            {
                                val = Convert.ToDouble(str31[i - 1]) / Convert.ToDouble(str31[i + 1]);
                                str31.RemoveRange(i - 1, 3);
                                str31.Insert(i - 1, val.ToString());
                            }
                        }
                    }
                    while (str31.Contains("+"))
                    {
                        for (int i = 0; i < str31.Count; i++)
                        {
                            if (str31[i] == "+")
                            {
                                val = Convert.ToDouble(str31[i - 1]) + Convert.ToDouble(str31[i + 1]);
                                str31.RemoveRange(i - 1, 3);
                                str31.Insert(i - 1, val.ToString());
                            }
                        }
                    }
                    while (str31.Contains("-"))
                    {
                        for (int i = 0; i < str31.Count; i++)
                        {
                            if (str31[i] == "-")
                            {
                                val = Convert.ToDouble(str31[i - 1]) - Convert.ToDouble(str31[i + 1]);
                                str31.RemoveRange(i - 1, 3);
                                str31.Insert(i - 1, val.ToString());
                            }
                        }
                    }
                }
                str4 = str4.Replace("(" + sub + ")", str31[0].ToString());
            }

            string sum = str4;

答案 4 :(得分:0)

我想到的最结构化的方法是定义一个由运算符符号组成的语法(在你的例子中显然是+, - ,*,/和^)和操作数;那么,如果存在定义语法中的输入的派生,则派生基本上是表达式树,然后可以在操作符被直接转换为实际操作时递归遍历该表达式树。我承认描述有点模糊,但好的解析可能有点困难。或许看一下LL parser可能有所帮助。