powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / как вычислить выражение?
25 сообщений из 116, страница 4 из 5
как вычислить выражение?
    #37959187
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЪыжслоЗапускаю в дебаге студии и даю жене
Изверг
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37959210
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

наверное он от нее добивается то че никогда не получал, а она не хочет вот и ломает, ломает,....
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37959816
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нравится такое решение... Довольно мощный механизм, когда использовал в VB6

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Imports System

Class Program

    Shared Sub Main()
        Console.WriteLine(Eval("(1+2)/4"))
        Console.ReadLine()
    End Sub

    Shared Function Eval(ByVal Code As String) As Object
        Static objSC As Object

        If objSC Is Nothing Then
            objSC = Activator.CreateInstance(Type.GetTypeFromProgID("MSScriptControl.ScriptControl"))
            objSC.Language = "VBScript"
        End If

        Return objSC.Eval(Code)
    End Function

End Class
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37959904
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADМне нравится такое решение... Довольно мощный механизм, когда использовал в VB6
Очень плохой способ. Во-первых COM, во-вторых тогда уж лучше юзать референс на Microsoft Script Control 1.0, ну и в третьих:
http://msdn.microsoft.com/en-us/library/aa227633(VS.60).aspx Before we go any further, I should warn you that using the ScriptControl is not for everyone. The ScriptControl is one of the least-documented controls available in Visual Basic. Most of the documentation for MSScript and VBScript was developed for people building web applications. You can incorporate the ScriptControl into your own programs, but expect to spend some time getting the feel of this control and its quirks. Also, be sure to save your programs (both Visual Basic and VBScript) often.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37960093
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУВо-первых COM
Не проблема. Понятное дело что уже устарело, и не нативно по отношению к .NET. Но на существование имеет право быть.
МСУво-вторых
Согласен. Писал чтобы копи-паст и запустил, без лишних движений.
МСУв третьих
Ну не особо проблема... Для разработчика VB "познавшего" языка со всеми его приколами и фичами )
Согласно задаче автора топика, ему достаточно эвалюатора. В рамках .NET - CodeDom Compiler решение довольно хорошее... если не трогать COM
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37960120
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADВ рамках .NET - CodeDom Compiler решение довольно хорошее... если не трогать COM
У CodeDom Compiler есть один минус - он генерит сборку. А хотелось бы чистого решения в памяти, что-то типа Microsoft Script Control, но чтобы не COM. Всякие там DataTable.Compute, XPathExpression.Compile и иже с ними - отличное решение, но сильно ограниченное по функционалу. Для себя давно решил - пока CodeDom.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37960144
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУУ CodeDom Compiler есть один минус - он генерит сборку. А хотелось бы чистого решения в памяти, что-то типа Microsoft Script Control, но чтобы не COM. Всякие там DataTable.Compute, XPathExpression.Compile и иже с ними - отличное решение, но сильно ограниченное по функционалу. Для себя давно решил - пока CodeDom. Dynamic LINQ чем не понравился?
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37960264
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУУ CodeDom Compiler есть один минус - он генерит сборку. А хотелось бы чистого решения в памяти, что-то типа Microsoft Script Control, но чтобы не COM. Всякие там DataTable.Compute, XPathExpression.Compile и иже с ними - отличное решение, но сильно ограниченное по функционалу. Для себя давно решил - пока CodeDom. Dynamic LINQ чем не понравился?
Ну а примерчик как всегда слабо? :)
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37960276
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей Кпропущено...
Dynamic LINQ чем не понравился?
Ну а примерчик как всегда слабо? :)А я не умею. Вот и интересуюсь как оно. :-)
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37961028
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2
Код: c#
1.
2.
3.
4.
5.
	   SqlCeCommand sqlEval = new SqlCeCommand("select (123.0/4+5*sin(0.5)) as Result", con);
                con.Open();
                var result = sqlEval.ExecuteScalar();
                con.Close();
                MessageBox.Show(result.ToString());



А почему бы и нет :)

Код: c#
1.
2.
3.
4.
5.
6.
using (var connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\;Extended Properties=dBASE IV"))
using (var command = new OleDbCommand("select 7 * sin(90) * sqr(9)", connection))
{
    connection.Open();
    var sasasas = command.ExecuteScalar();
}
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37961216
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУпропущено...

Ну а примерчик как всегда слабо? :)А я не умею. Вот и интересуюсь как оно. :-)
Код: c#
1.
2.
3.
4.
5.
6.
                        decimal znach = Eval(drk["Формула"].ToString(), ds, "[Период отчетности] = '" + r["ИД"].ToString() + "'");
                        Expression body = System.Linq.Dynamic.DynamicExpression.Parse(null, drk["1 Категория"].ToString(), symbols);
                        LambdaExpression e = Expression.Lambda(
                            body, new ParameterExpression[] { x });
                        bool k = (bool)e.Compile().DynamicInvoke(znach);
                        if (k) drr["1 Категория"] = znach.ToString();
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37961218
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eval через DataTable
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
        private decimal Eval(string formula, YSBMESDataSet Ds, string where)
        {
            // Найти используемые формы,строки,переменные и собрать рабочую таблицу
            DataTable DTRab = new DataTable("DTRab");
            string[] FormSplit;
            decimal Des;
            // Создаем графы используемые в формуле
            string Formula = formula;
            Formula = Formula.Replace('(', ' ');
            Formula = Formula.Replace(')', ' ');
            FormSplit = Formula.Split(new char[] { '+', '-', '*', '/' });
            for (int i = 0; i < FormSplit.Length; i++)
            {
                if (!DTRab.Columns.Contains(FormSplit[i].ToString().Trim()))
                {
                    try
                    {
                        Des = System.Convert.ToDecimal(FormSplit[i].ToString().Trim());
                    }
                    catch
                    {
                        DTRab.Columns.Add(FormSplit[i].ToString().Trim(), System.Type.GetType("System.Decimal"));
                    }
                }
            }
            // Создаем основную графу с формулой (только после граф используемых в формуле)
            DTRab.Columns.Add("Значение формулы", System.Type.GetType("System.Decimal"));
            DTRab.Columns["Значение формулы"].Expression = formula;


            // Заполняем данными из форм и ...
            DataRow DTRrow = DTRab.NewRow();
            DTRab.Rows.Add(DTRrow);
            string Tablisa, Stroka, Strokar;
            int Grafa;
            foreach (DataColumn DRCol in DTRab.Columns)
            {
                if (DRCol.ColumnName.IndexOf("_") > 0)
                {
                    Tablisa = DRCol.ColumnName.Substring(0, DRCol.ColumnName.IndexOf("_"));
                    Strokar = DRCol.ColumnName.Substring(Tablisa.Length + 1, DRCol.ColumnName.Length - (Tablisa.Length + 1));
                    Stroka = Strokar.Substring(0, Strokar.IndexOf("_"));
                    Grafa = System.Int32.Parse(Strokar.Substring(Stroka.Length + 1, Strokar.Length - (Stroka.Length + 1)));
                    if (!Ds.Tables.Contains(Tablisa))
                    {
                        main.LoadAndFillMacroType("Отчетность предприятий");
                        //                        main.CreateType(Tablisa, main.GetTypeIDByTypeName(Tablisa), true);
                    }
                    DataView RowF = new DataView(Ds.Tables[Tablisa], where + " and [Код строки] = '" + Stroka + "'", "Код строки", DataViewRowState.CurrentRows);

                    int k = 0, j = 0;
                    foreach (DataColumn DC in Ds.Tables[Tablisa].Columns)
                    {
                        if (DC.DataType.FullName == "System.Decimal")
                        {
                            j++;
                            if (j == Grafa)
                            {
                                Grafa = k;
                                break;
                            }
                        }
                        k++;
                    }


                    decimal Summa = 0;
                    for (int i = 0; i < RowF.Count; i++)
                    {
                        Summa = Summa + System.Decimal.Parse(RowF[i].Row.ItemArray[Grafa].ToString());
                    }

                    try
                    {
                        DTRab.Rows[0][DRCol.ColumnName] = Summa.ToString();
                    }
                    catch { }
                }
            }

            try
            {
                return decimal.Round(decimal.Parse(DTRab.Rows[0]["Значение формулы"].ToString()), 2);
            }
            catch
            {
                return 0;
            }
        }
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37961220
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ViPRos,

Что-то длинно слишком. Сам код не смотрел
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37961222
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

3 строчки много?
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37961223
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код ниже, это другой способ
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37961230
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos, тебя прёт какие лохмотья постить на форум? Нормальные люди если постить, постят нормальный понятный компилящийся код. Неужели ты думаешь кто-то захочет ковыряться в твоём мутном гавнокоде.

Так слабо было отпостить?

Код: c#
1.
2.
3.
string exp = "Math.PI + Math.Sin(180) + Math.Sqrt(9)";
var expression = System.Linq.Dynamic.DynamicExpression.ParseLambda(new ParameterExpression[] { }, typeof(object), exp);
var result = expression.Compile().DynamicInvoke();
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37961232
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

ну некогда чистить код, выдрал, да показал
я ж не для выебона, а так, токмо ляля ради
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37961272
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosну некогда чистить код, выдрал, да показал
я ж не для выебона, а так, токмо ляля ради
Ну криво это, Сахават, реально криво :) Хочешь продемонстировать - возьми и покажи вменяемый вариант.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37961349
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

ладно уж простите великодушно, не буду больше
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37961379
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosМСУ, ладно уж простите великодушно, не буду больше
Длинк рвёт остальных конкурентов (кроме коддома) по функциональности, это приятно.

Кстати, еще мощный вариант - это msxsl:script. То есть на входе xslt (XsltSettings.EnableScript = true) с функцией, переменные в xml, на выходе результирующий просчитанный xml. Отличный вариант, без генерации сборки.
Только для безопасности лучше это дело выполнять в отдельной песочнице (AppDomain) с минимальными пермиссиями.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #37961398
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот, зацените, сабжевое на JS
как всегда - просто и функционально. Можно объявлять пользовательские функции, юзать переменные..
http://jsfiddle.net/wfABg/

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
function Parser() {
    var __userfuncs = {};
    this.addUserFunc = function(name, params, expr) {
        __userfuncs[name] = new Function(params, 'return ' + expr + ';');
    },
    this.calc = function(expr, params) {
        with (__userfuncs) {
            with (Math) {
                with (params || {}) {
                    return eval(expr);
                }
            }
        }
    }
}



// использование
var parser = new Parser();

parser.addUserFunc('jopa', 't', 't*2');
    
alert(parser.calc('sin(PI/x) + jopa(y)', {x: 2, y: 4}));

...
Рейтинг: 0 / 0
как вычислить выражение?
    #37961590
Фотография tsyselsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный Меча вот, зацените, сабжевое на JS
как всегда - просто и функционально. Можно объявлять пользовательские функции, юзать переменные..

Ну если не юзать .Net (кодедом, длинк, F#, IronPyton и т.п.), то вариантов масса.

Cабж на Erlang до кучи :]
Код: c#
1.
2.
3.
4.
5.
6.
7.
-module(eval).
-export([expr/2]).

expr(S,Environ) ->
    {ok,Scanned,_} = erl_scan:string(S),
    {ok,Parsed} = erl_parse:parse_exprs(Scanned),
    erl_eval:exprs(Parsed,Environ).



eval:exprs/2



Впрочем можно Erlang и на .Net поюзать https://github.com/takayuki/Erlang.NET
...
Рейтинг: 0 / 0
как вычислить выражение?
    #38070103
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://codearticles.ru/Home/ArticleView/1469

Опубликовал в одном месте все возможные варианты решения задачи. Пока их 8. Если знаете еще что-то интересное, кидайте рецепт.
...
Рейтинг: 0 / 0
как вычислить выражение?
    #38070237
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
МСУЕсли знаете еще что-то интересное, кидайте рецепт.
Эксель - наше фсе!

Код: c#
1.
2.
3.
4.
5.
6.
7.
using Excel = Microsoft.Office.Interop.Excel;
...
Excel.Worksheet WS = (new Excel.Application()).Workbooks.Add().Sheets.Add();
Excel.Range r = WS.Cells[1, 1];
r.Formula = "= 123/500 + SIN(1) + SUM(20,30)";
var result = r.Value;
MessageBox.Show(result.ToString());
...
Рейтинг: 0 / 0
как вычислить выражение?
    #38070243
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Эксель - наше фсе!
Вот это жесть :) Хотя, чем не способ - добавил уже второй кото-рецепт.
...
Рейтинг: 0 / 0
25 сообщений из 116, страница 4 из 5
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / как вычислить выражение?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]