12

Is there an easy way to evaluate strings like "(4+8)*2" So that you'd get the int value of 24?

Or is there a lot of work needed to get this done...?

Rand Random
  • 7,300
  • 10
  • 40
  • 88
Mark Lalor
  • 7,820
  • 18
  • 67
  • 106
  • 1
    You can have a look at: [The expression evaluator revisited (Eval function in 100% managed .NET)](http://www.codeproject.com/KB/recipes/eval3.aspx) – Devendra D. Chavan Apr 30 '11 at 01:53

3 Answers3

46

Someone else added this and then it got deleted. I thought it was pretty cool because no 3rd party libraries required.

class Program
    {

        static void Main(string[] args)
        {
            Console.WriteLine(Evaluate("(4+8)*2"));
            Console.ReadKey();
        }

        public static double Evaluate(string expression)
        {
            DataTable table = new DataTable();
            table.Columns.Add("expression", typeof(string), expression);
            DataRow row = table.NewRow();
            table.Rows.Add(row);
            return double.Parse((string)row["expression"]);
        }

    } 
Richard Brightwell
  • 3,012
  • 2
  • 20
  • 22
  • 2
    In my use, this solution was about 1.5x faster than NCalc, while being equally stable (at least for what I was doing). It handled boolean expressions just as same as NCalc. This should be advertised more. – tootsiejasmine Oct 09 '13 at 04:46
  • This doesn't handle powers or square roots. – seekerOfKnowledge Oct 15 '13 at 19:26
  • 1
    this solution is perfect for simple expressions as i need it. Thank you for re-posting it. – zreptil Mar 09 '14 at 08:03
  • Meanwhile i found a problem: numbers with fractions (like 1.5) are parsed with point (.) being the only allowed separator. is this correct? Can i rely on this in every language? in german the standard separator for fractions is komma (,). But when i use this, the parsing fails. – zreptil Mar 09 '14 at 09:09
  • 1
    zreptil: you have to assure that all number values within your expression are written to string with the InvariantCulture --> i.e.: myDouble.ToString(System.Globalization.CultureInfo.InvariantCulture) – fixagon May 23 '14 at 11:21
  • Does anyone have a link to anything that would lay out the limitations of this technique? What is allowed/not allowed, etc. – Shane Courtrille Jul 02 '14 at 15:45
  • Don't support log, power and exponential functions – mongesh madhavan Aug 22 '16 at 07:24
  • Not a bad answer but it's a bit wordy you can just: double.Parse(new ystem.Data.DataTable().Compute(expression, "")) – Craig Norton Jun 23 '17 at 10:43
  • Very clever solution. But additional downside is that it doesn't support bitwise operations, such as | for OR, & for AND, etc. – c00000fd Oct 23 '18 at 07:41
20

Use Ncalc:

Expression e = new Expression("(4+8)*2");
Debug.Assert(24 == e.Evaluate());   

http://ncalc.codeplex.com/

Also, this question had been previously asked and has some interesting answers including Ncalc : Evaluating string "3*(4+2)" yield int 18

Community
  • 1
  • 1
manojlds
  • 290,304
  • 63
  • 469
  • 417
5

You need a Math Expression Parser for that. Below are resources on that:

Alex M
  • 2,410
  • 1
  • 24
  • 37
Teoman Soygul
  • 25,584
  • 6
  • 69
  • 80