Skip to content
James Cane edited this page May 19, 2017 · 10 revisions

Project Description

NCalc is a mathematical expressions evaluator in .NET. NCalc can parse any expression and evaluate the result, including static or dynamic parameters and custom functions.

var e = new Expression ("2 + 3 * 5");

Update: May 2017

Exciting news! NCalc has moved to GitHub due to the impending closure of CodePlex and has acquired a new maintainer. I plan to initially make a number of performance improvements to NCalc, before adding some new functionality over the coming months.

Please send me a message if you have ideas, comments or requests for functionality.

Functionality

Simple expressions

    Debug.Assert(123456 == new Expression("123456").Evaluate()); // integers`
    Debug.Assert(new DateTime(2001, 01, 01) == new Expression("#01/01/2001#").Evaluate()); // date and times`
    Debug.Assert(123.456 == new Expression("123.456").Evaluate()); // floating point numbers`
    Debug.Assert(true == new Expression("true").Evaluate()); // booleans`
    Debug.Assert("azerty" == new Expression("'azerty'").Evaluate()); // strings

Handles mathematical functional from System.Math

    Debug.Assert(0 == new Expression("Sin(0)").Evaluate());
    Debug.Assert(2 == new Expression("Sqrt(4)").Evaluate());
    Debug.Assert(0 == new Expression("Tan(0)").Evaluate());

Evaluates custom functions

    Expression e = new Expression("SecretOperation(3, 6)");
    e.EvaluateFunction += delegate(string name, FunctionArgs args)
    {
        if (name == "SecretOperation")
            args.Result = (int)args.Parameters[0].Evaluate() + (int)args.Parameters[1].Evaluate();
    };
     
    Debug.Assert(9 == e.Evaluate());`

Handles unicode characters

  Debug.Assert("経済協力開発機構" == new Expression("'経済協力開発機構'").Evaluate());
  Debug.Assert("Hello" == new Expression(@"'\u0048\u0065\u006C\u006C\u006F'").Evaluate());
  Debug.Assert("" == new Expression(@"'\u3060'").Evaluate());
  Debug.Assert("\u0100" == new Expression(@"'\u0100'").Evaluate());`

Define parameters, even dynamic or expressions

    Expression e = new Expression("Round(Pow([Pi], 2) + Pow([Pi2], 2) + [X], 2)");
    
    e.Parameters["Pi2"] = new Expression("Pi * [Pi]");
    e.Parameters["X"] = 10;
    
    e.EvaluateParameter += delegate(string name, ParameterArgs args)
    {
        if (name == "Pi")
        args.Result = 3.14;
    };

    Debug.Assert(117.07 == e.Evaluate());