views:

1088

answers:

7
+6  Q: 

C# Math calculator

+9  A: 

DataTable has a Compute method that allows you to write this:

var result = new DataTable().Compute("2-3/4*12", null);

Note that this is limited to simple math expressions.

Other option consist in using a dynamic language in the DLR such as IronPython and IronRuby. Check-out this post:

var engine = new IronPython.Hosting.PythonEngine();
double result = pythonEngine.EvaluateAs<double>("2-3/4*12");

You may also check the NCalc library on CodePlex.

Darin Dimitrov
Interesting. Never knew such a thing existed!
Moron
A: 

Uh that seems like a very over the top solution.

What you really want is a simple parser.

You need to break the string up into tokens and then evaluate them. This will get you started researching. http://en.wikipedia.org/wiki/Parsing#Overview_of_process

James Van Boxtel
A: 

best option is to build Expression tree. First you build tree of your expression, then use http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx you can compile it then easily using http://msdn.microsoft.com/en-us/library/bb356928(v=VS.100).aspx

Andrey
+2  A: 

Check out FLEE (Fast Lightweight Expression Evaluator) - http://flee.codeplex.com/

Flee is an expression parser and evaluator for the .NET framework. It allows you to compute the value of string expressions such as sqrt(a^2 + b^2) at runtime. It uses a custom compiler, strongly-typed expression language, and lightweight codegen to compile expressions directly to IL. This means that expression evaluation is extremely fast and efficient. Try out the demo, which lets you generate images based on expressions, and see for yourself.

It's free and fast and I've used it in a couple of projects.

Alex Warren
Looks cool. Can you share how you've used it other than for standard expression eval; e.g. how did it affect your architecture, etc.
David Robbins
+2  A: 

NB: This answer is just for completeness. It's definitely not an approach that I'd recommend.

It's possible to access the (deprecated) JScript libraries directly from C#, which means that you can use the equivalent of JScript's eval function.

using Microsoft.JScript;        // needs a reference to Microsoft.JScript.dll
using Microsoft.JScript.Vsa;    // needs a reference to Microsoft.Vsa.dll

// ...

string expr = "2 - 3 / 4 * 12";
Console.WriteLine(JScriptEval(expr));    // displays -7

// ...

public static VsaEngine _engine = VsaEngine.CreateEngine();

public static double JScriptEval(string expr)
{
    // error checking etc removed for brevity

    return double.Parse(Eval.JScriptEvaluate(expr, _engine).ToString());
}
LukeH
+4  A: 

There are some interesting options available to you.

  1. NCalc - a C# Lexer Parser built with ANTLR. This will parse your text and allow you to assign values to parameters / variables. The interpreter is C#, so you do not have to load additional assemblies in an app domain, etc.

  2. JINT - a C# based Javascript interpreter built by the same author of ECalc using ANTLR to create the grammar. This is currently in beta but works well with calculations and functions.

  3. CS-Script.Net - From the site: "CS-Script is a CLR (Common Language Runtime) based scripting system which uses ECMA-compliant C# as a programming language. CS-Script currently targets Microsoft implementation of CLR (.NET 2.0/3.0/3.5) with limited support on Mono." The load scripts and create assemblies in memory and separate app domain. It is quite robust, and I use it in production for embedded scripting.

David Robbins
A: 

Definitely in the "do not recommend" category, but for completeness -- if you've got a database you can conveniently connect to, send it the query "SELECT expression".

Richard Dunlap