Результат формулы из строки c#

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
Здравствуйте!

Подскажите, пожалуйста, можно ли формулу в строке преобразовать в результат?
Формула примерно такого вида "19 + (4 * 273) =".
 

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
В принципе решил требуемую задачу, но если есть более простой способ, то было бы хорошо.

Решил так:
Код:
string text = "19 + (4 * 273) =";

string skobki = @"(?<=\().*(?=\))";     // выбор из скобок
string skobki_chislo_1 = @".*?(?=\s)";     // получение 1-го числа из скобок
string skobki_operator = @"(?<=\s).*?(?=\s)"; // получение оператора умножения
string skobki_chislo_2 = @"(?<=\*).*"; // получение 2-го числа из скобок
string chislo = @".*?(?=\s)"; // получение числа за скобками
string op = @"(?<=\s).*(?=\s\()"; // получение оператора за скобками

string out_skobki = System.Text.RegularExpressions.Regex.Match(text, skobki).ToString();
string out_skobki_chislo_1 = System.Text.RegularExpressions.Regex.Match(out_skobki, skobki_chislo_1).ToString();
string out_skobki_operator = System.Text.RegularExpressions.Regex.Match(out_skobki, skobki_operator).ToString();
string out_skobki_chislo_2 = System.Text.RegularExpressions.Regex.Match(out_skobki, skobki_chislo_2).ToString();
string out_chislo = System.Text.RegularExpressions.Regex.Match(text, chislo).ToString();
string out_op = System.Text.RegularExpressions.Regex.Match(text, op).ToString();

int res_out = 0;

switch(out_skobki_operator)
{
    case "*":
    res_out = int.Parse(out_skobki_chislo_1) * int.Parse(out_skobki_chislo_2);
    break;
       
    case "/":
    res_out = int.Parse(out_skobki_chislo_1) / int.Parse(out_skobki_chislo_2);
    break;
       
    case "+":
    res_out = int.Parse(out_skobki_chislo_1) + int.Parse(out_skobki_chislo_2);
    break;
       
    case "-":
    res_out = int.Parse(out_skobki_chislo_1) - int.Parse(out_skobki_chislo_2);
    break;       
}

switch(out_op)
{
    case "*":
    res_out = int.Parse(out_chislo) * res_out;
    break;
       
    case "/":
    res_out = int.Parse(out_chislo) / res_out;
    break;
       
    case "+":
    res_out = int.Parse(out_chislo) + res_out;
    break;
       
    case "-":
    res_out = int.Parse(out_chislo) - res_out;
    break;       
}


return res_out;
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 963
Благодарностей
796
Баллы
113
Для C# это нормально. Может быть, на Жабаскрипте можно динамически прямо содержимое переменной вычислить?
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 880
Баллы
113

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 263
Баллы
113
Добавлю от себя
C#:
var result = new DataTable().Compute("19 + (4 * 273)", null); // 1111
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 963
Благодарностей
796
Баллы
113

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
Благодарю! :-)
Вариант "var result =new DataTable().Compute("19 + (4 * 273)", null);// 1111" просто супер! :-)
 

kolina

Client
Регистрация
05.10.2019
Сообщения
158
Благодарностей
44
Баллы
28
Математические действия с С#. Упираюсь уже не один час. Подскажите пожалуйста как это из JS разложить в C#. В переменных не целые числа. Спасибо!
JavaScript:
({-Variable.priceZac-}*{-Variable.kyrs-}/0.78)+({-Variable.KyrsUSD-}*3.9)
 

djaga

Client
Регистрация
26.04.2020
Сообщения
505
Благодарностей
1 052
Баллы
93
Математические действия с С#. Упираюсь уже не один час. Подскажите пожалуйста как это из JS разложить в C#. В переменных не целые числа. Спасибо!
JavaScript:
({-Variable.priceZac-}*{-Variable.kyrs-}/0.78)+({-Variable.KyrsUSD-}*3.9)
Создайте такой набор переменных, введите в эти переменные данные и будет работать. Разделитель для рядности числа, символ ",".
95255

C#:
double priceZac = double.Parse(project.Variables["priceZac"].Value);
double kyrs = double.Parse(project.Variables["kyrs"].Value);
double KyrsUSD = double.Parse(project.Variables["KyrsUSD"].Value);

double res = (priceZac * kyrs / 0.78) + (KyrsUSD * 3.9);
project.Variables["res"].Value = res.ToString();

project.SendInfoToLog(res.ToString());
Ниже приложил шаблон ↓.
 

Вложения

  • Спасибо
Реакции: kolina

kolina

Client
Регистрация
05.10.2019
Сообщения
158
Благодарностей
44
Баллы
28
Милый человек, дай Бог тебе здоровья. Проекты стараюсь писать без использования браузера, и постоянно ругается Zenka.
Неправильно считает.
priceZac = 1,56
kyrs = 23,5
KyrsUSD = 60

когда решает C# результат 281
когда решает JS результат 240

C#:
double priceZac = double.Parse(project.Variables["priceZac"].Value);
double kyrs = double.Parse(project.Variables["kyrs"].Value);
double KyrsUSD = double.Parse(project.Variables["KyrsUSD"].Value);

double res = (priceZac * kyrs / 0.78) + (KyrsUSD * 3.9);
project.Variables["MinDopystimPrice"].Value = res.ToString();

project.SendInfoToLog(res.ToString());
 
Последнее редактирование:
  • Спасибо
Реакции: vedi108 и djaga

djaga

Client
Регистрация
26.04.2020
Сообщения
505
Благодарностей
1 052
Баллы
93
Милый человек, дай Бог тебе здоровья. Проекты стараюсь писать без использования браузера, и постоянно ругается Zenka.
Неправильно считает.
priceZac = 1,56
kyrs = 23,5
KyrsUSD = 60

когда решает C# результат 281
когда решает JS результат 240

C#:
double priceZac = double.Parse(project.Variables["priceZac"].Value);
double kyrs = double.Parse(project.Variables["kyrs"].Value);
double KyrsUSD = double.Parse(project.Variables["KyrsUSD"].Value);

double res = (priceZac * kyrs / 0.78) + (KyrsUSD * 3.9);
project.Variables["MinDopystimPrice"].Value = res.ToString();

project.SendInfoToLog(res.ToString());
Кажется, перед этой формулой есть ещё манипуляции в js, а может и после.)

Посчитайте сами на калькуляторе. У вас получается 240?
95260
 
  • Спасибо
Реакции: kolina

kolina

Client
Регистрация
05.10.2019
Сообщения
158
Благодарностей
44
Баллы
28
Пересчитал. Да всё верно. Извиняюсь. Видимо что то напутал с разделителями. Для JS точка, а для c# запятая. Огромное тебе спасибо!!!
 
  • Спасибо
Реакции: djaga

kolina

Client
Регистрация
05.10.2019
Сообщения
158
Благодарностей
44
Баллы
28
Опять я и опять понадобилась помощь. мучаю с chat gpt уже пару часов. нужно решить уравнение на C#
Код:
double Zakypka = double.Parse(project.Variables["Zakypka"].Value);
double Nalig = double.Parse(project.Variables["Nalig"].Value);
double MinDohod = double.Parse(project.Variables["MinDohod"].Value);
double baliZaOtzivi = double.Parse(project.Variables["baliZaOtzivi"].Value);
double RURBUN = double.Parse(project.Variables["RURBUN"].Value);
double obrabotkaOzon = double.Parse(project.Variables["obrabotkaOzon"].Value);
double avtoActionPercent = double.Parse(project.Variables["avtoActionPercent"].Value);
double prodvijenie = double.Parse(project.Variables["prodvijenie"].Value);
double percent = double.Parse(project.Variables["percent"].Value);
double Upakovka = double.Parse(project.Variables["Upakovka"].Value);
double dostavka = double.Parse(project.Variables["dostavka"].Value);
double mila = double.Parse(project.Variables["mila"].Value);
double eqar = double.Parse(project.Variables["eqar"].Value);

double X = 0; // Начальное значение X
double equationResult = 0; // Инициализация результата уравнения

// Итеративный подход для нахождения значения X
while (true)
{
    equationResult = MinDohod + (X * baliZaOtzivi) + (X * prodvijenie) + obrabotkaOzon + (X * percent) + (X * Upakovka) + (X * dostavka) + (X * mila) + (X * eqar) + (Zakypka * RURBUN) + (X - ((X * baliZaOtzivi) + (X * prodvijenie) + obrabotkaOzon + (X * percent) + (X * Upakovka) + (X * dostavka) + (X * mila) + (X * eqar)) - (Zakypka * RURBUN)) * Nalig;

    // Проверка условия для выхода из цикла
    if (Math.Abs(equationResult - X) < 0.0001)
        break;

    X = equationResult;
}

double roundedX = Math.Round(X);
project.Variables["roundedX"].Value = roundedX.ToString();

return roundedX;

Что бы он мне не писал, всегда ошибка.

Нужно найти X
X = 180 + ((X * 0) + (X * 0.085) + (X * 0.13) + (X * 0.03) + (X * 0.06) + (X * 0.055) + (X * 0.015) + (10 * 28) + (X - ((X * 0) + (X * 0.085) + (X * 0.13) + (X * 0.03) + (X * 0.06) + (X * 0.055) + (X * 0.015)) - (10 * 28) * 0.2

Если кто вдруг может осилить, Заранее огромное спасибо!!
 

kolina

Client
Регистрация
05.10.2019
Сообщения
158
Благодарностей
44
Баллы
28
Всё отлично работает. Я у Chata спросил какой разделитель нужно использовать, а он мне написал точка, а когда попробовал с запятой, то всё работает.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)