Есть ли в .NET оценщик математики строки? - PullRequest
79 голосов
/ 10 декабря 2008

Если у меня есть строка с допустимым математическим выражением, например:

String s = "1 + 2 * 7";

Есть ли встроенная библиотека / функция в .NET, которая будет анализировать и оценивать это выражение для меня и возвращать результат? В этом случае 15.

Ответы [ 15 ]

3 голосов
/ 27 января 2014

Я бы также взглянул на Jace (https://github.com/pieterderycke/Jace). Jace - это высокопроизводительный математический анализатор и механизм вычислений, который поддерживает все разновидности .NET (.NET 4.x, Windows Phone, Windows Store, .. .). Jace также доступен через NuGet: https://www.nuget.org/packages/Jace

1 голос
/ 15 июня 2015

Я реализовал парсер выражений несколько лет назад и недавно опубликовал его версию в GitHub и Nuget: Albatross.Expression Он содержит класс ExecutionContext, который может оценивать набор выражений, таких как:

  • MV = Цена * Кол-во;
  • Цена = (Bid + Ask) / 2;
  • Ставка = 0,6;
  • Ask = .8;

Он также имеет встроенную проверку циклических ссылок, что полезно во избежание переполнения стека.

0 голосов
/ 07 марта 2019

MathNet.Symbolics

using System;
using static MathNet.Symbolics.SymbolicExpression;
using static System.Console;
using static System.Numerics.Complex;
using Complex = System.Numerics.Complex;

namespace MathEvaluator
{
    class Program
    {
        static readonly Complex i = ImaginaryOne;

        static void Main(string[] args)
        {
            var z = Variable("z");
            Func<Complex, Complex> f = Parse("z * z").CompileComplex(nameof(z));
            Complex c = 1 / 2 - i / 3;
            WriteLine(f(c));


            var x = Variable("x");
            Func<double, double> g = Parse("x * x + 5 * x + 6").Compile(nameof(x));
            double a = 1 / 3.0;
            WriteLine(g(a));
        }
    }
}

Не забудьте загрузить

<PackageReference Include="MathNet.Symbolics" Version="0.20.0" />
0 голосов
/ 18 июля 2015

Бегите Быстрый Легкий Экспресс Оценщик

https://flee.codeplex.com

Справочник по языку

  • ArithmeticOperators Пример: a * 2 + b ^ 2 - 100% 5
  • ComparisonOperators Пример: a <> 100
  • Пример AndOrXorNotOperators (логический): a> 100, а не b = 100
  • ShiftOperators Пример: 100 >> 2
  • Пример конкатенации: "abc" + "def"
  • Пример индексации: arr [i + 1] + 100
  • литералы
  • Пример кастинга: 100 + каст (obj, int)
  • Пример условного оператора: Если (a> 100 и b> 10, «оба больше», «меньше»)
  • Пример InOperator (список): If (100 in (100, 200, 300, -1), «in», «not in»)
  • перегруженные операторы типов

Пример:

Imports Ciloci.Flee
Imports Ciloci.Flee.CalcEngine
Imports System.Math

    Dim ec As New Ciloci.Flee.ExpressionContext
    Dim ex As IDynamicExpression
    ec.Imports.AddType(GetType(Math))

    ec.Variables("a") = 10            
    ec.Variables("b") = 40               
    ex = ec.CompileDynamic("a+b")

    Dim evalData    
    evalData = ex.Evaluate()
    Console.WriteLine(evalData)

Выход: 50

0 голосов
/ 13 февраля 2013
namespace CalcExp
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            double res = Evaluate("4+5/2-1");

            Console.WriteLine(res);

        }

        public static double Evaluate(string expression)
        {
            var xsltExpression =
                string.Format("number({0})",
                    new Regex(@"([\+\-\*])").Replace(expression, " ${1} ")
                                            .Replace("/", " div ")
                                            .Replace("%", " mod "));

// ReSharper disable PossibleNullReferenceException
            return (double)new XPathDocument
                (new StringReader("<r/>"))
                    .CreateNavigator()
                    .Evaluate(xsltExpression);
// ReSharper restore PossibleNullReferenceException
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...