Расчет формул JScriptEvaluate
От: zoom-zoom  
Дата: 16.02.15 14:34
Оценка: :)
День добрый!

Вычисляю формулы следующим образом:

 string Формула = "10.2 + (2 * 4) / 2 + Math.abs(-2)";
 var Результат = Microsoft.JScript.Eval.JScriptEvaluate(Формула.Replace(',', '.'), VsaEngine.CreateEngine());


Может кто сталкивался, есть ли альтернативы более надежные и более быстрые?
Re: Расчет формул JScriptEvaluate
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.02.15 15:20
Оценка:
Здравствуйте, zoom-zoom, Вы писали:

ZZ>Может кто сталкивался, есть ли альтернативы более надежные и более быстрые?


Парсер формул на любом приличном генераторе парсеров пишется за 10 минут. Интерпретатор или компилятор еще за час.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re: Расчет формул JScriptEvaluate
От: Sinatr Германия  
Дата: 17.02.15 07:56
Оценка:
Здравствуйте, zoom-zoom, Вы писали:

ZZ>Может кто сталкивался, есть ли альтернативы более надежные и более быстрые?


Строку можно скомпилировать и запускать используя CodeDom. Без учета времени компиляции (например, используя пре-компилицию формул) вызов должен быть быстрее.
---
ПроГLамеры объединяйтесь..
Re: Расчет формул JScriptEvaluate
От: hardcase Пират http://nemerle.org
Дата: 17.02.15 09:52
Оценка: :)
Здравствуйте, zoom-zoom, Вы писали:

ZZ>Вычисляю формулы следующим образом:


ZZ>
ZZ> string Формула = "10.2 + (2 * 4) / 2 + Math.abs(-2)";
ZZ> var Результат = Microsoft.JScript.Eval.JScriptEvaluate(Формула.Replace(',', '.'), VsaEngine.CreateEngine());
ZZ>


А вот такую формулу он вычислит?

string Формула = "Environment.FailFast('Kaboom!')";


Касательно парсера поиграйся с Irony например
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Расчет формул JScriptEvaluate
От: pugv Россия  
Дата: 17.02.15 10:12
Оценка:
Здравствуйте, zoom-zoom, Вы писали:

ZZ>Вычисляю формулы следующим образом:


Вот нашёл старую поделку, может будет интересно руками попарсить
Re: Расчет формул JScriptEvaluate
От: nikov США http://www.linkedin.com/in/nikov
Дата: 12.03.15 04:22
Оценка:
Здравствуйте, zoom-zoom, Вы писали:

ZZ>Может кто сталкивался, есть ли альтернативы более надежные и более быстрые?


Можно так:

using System;
using System.Runtime.InteropServices;

class Program
{
    static void Main()
    {
        dynamic calc = Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid(148736, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70)));
        Console.WriteLine(calc.Evaluate("2 + 3 * 5")); // 17
    }
}
Re[2]: Расчет формул JScriptEvaluate
От: zoom-zoom  
Дата: 12.03.15 08:43
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, zoom-zoom, Вы писали:


ZZ>>Может кто сталкивался, есть ли альтернативы более надежные и более быстрые?


N>Можно так:


N>
N>using System;
N>using System.Runtime.InteropServices;

N>class Program
N>{
N>    static void Main()
N>    {
N>        dynamic calc = Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid(148736, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70)));
N>        Console.WriteLine(calc.Evaluate("2 + 3 * 5")); // 17
N>    }
N>}
N>


calc.Evaluate(Формула)) — если формула — строка, где более 255 символов, то данная конструкция не будет работать. А у меня как раз такие строки.
Re[2]: Расчет формул JScriptEvaluate
От: zoom-zoom  
Дата: 12.03.15 08:53
Оценка:
Здравствуйте, Sinatr, Вы писали:

S>Здравствуйте, zoom-zoom, Вы писали:


ZZ>>Может кто сталкивался, есть ли альтернативы более надежные и более быстрые?


S>Строку можно скомпилировать и запускать используя CodeDom. Без учета времени компиляции (например, используя пре-компилицию формул) вызов должен быть быстрее.


Написал так:
       static object Evaluator(string expression)
        {
            // компилятор кода C#
            ICodeCompiler cs = (new CSharpCodeProvider().CreateCompiler());
            // параметры компиляции: DLL в памяти
            CompilerParameters cp = new CompilerParameters();
            cp.ReferencedAssemblies.Add("system.dll");
            cp.GenerateExecutable = false; // создать DLL
            cp.GenerateInMemory = true;  // создать в памяти

            // текст программы на C#:
            string code = string.Empty;
            code += "using System;";
            code += "namespace CSEvaluator";
            code += "{ public class Evaluate";
            code += "  { public  double GetResult(){ return(\r\n" + expression + "\r\n); }";
            code += "  }";
            code += "}";

            // компиляция исходного кода и получение сборки
            CompilerResults cr = cs.CompileAssemblyFromSource(cp, code);

            if (cr.Errors != null && cr.Errors.Count > 0) // ? ошибки 
            {
                //for (int i = 0; i < cr.Errors.Count; i++)
                //    //Report(cr.Errors[i].Column + cr.Errors[i].ErrorText); 
                //    Console.WriteLine("Col {0} - {1}", cr.Errors[i].Column, cr.Errors[i].ErrorText);
                return (0.0);
            }

            try // создать объект и вызвать метод для вычисления выражения
            {
                object ob = cr.CompiledAssembly.CreateInstance("CSEvaluator.Evaluate");
                return (ob.GetType().InvokeMember("GetResult", BindingFlags.InvokeMethod, null, ob, new object[] { }));
            }
            catch
            { 
                ///Report(ex.Message.ToString()); 
                return (0.0); 
            }
        }

     var Result = Evaluator(expression); \\вызов


Считает очень долго, плюс не потокобезопасный, как и JScriptEvaluate, а хотелось бы расчеты делать параллельные. Пре-компилицию пока не разобрался, как сделать.
Re: Расчет формул JScriptEvaluate
От: ifle  
Дата: 12.03.15 12:18
Оценка:
посмотрите на эти, может подойдут
Fast Lightweight Expression Evaluator
https://flee.codeplex.com/

NCalc — Mathematical Expressions Evaluator for .NET
https://ncalc.codeplex.com/

ClearScript is a library that makes it easy to add scripting to your .NET applications. It currently supports JavaScript (via V8 and JScript) and VBScript.
http://clearscript.codeplex.com/
Отредактировано 12.03.2015 12:55 ifle . Предыдущая версия .
Re[2]: Расчет формул JScriptEvaluate
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.03.15 20:44
Оценка:
Здравствуйте, nikov, Вы писали:

N> dynamic calc = Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid(148736, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70)));


И чего это за СОМ либа такая?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[3]: Расчет формул JScriptEvaluate
От: nikov США http://www.linkedin.com/in/nikov
Дата: 13.03.15 17:03
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, nikov, Вы писали:


N>> dynamic calc = Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid(148736, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70)));


AVK>И чего это за СОМ либа такая?


На самом деле это была шутка
Это Excel.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.