/
fxk
/
calcapi
Обзор
Документация
Войти
/
fxk
/
calcapi
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Program.cs
108 строк
2 KB
foxuk
Добавил "расчет" процента
10 мар 2025, 07:32
10 мар 2025, 07:32
e072a61
Код
Авторство
О чём код?
using System.Globalization; using System.Text.RegularExpressions; var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseUrls(Environment.GetEnvironmentVariable("APP_URL") ?? "https://localhost:5000"); var app = builder.Build(); app.UseHttpsRedirection(); app.MapGet("/calc", (HttpContext context, string exp) => { var tokens = Array.FindAll(MyRegex().Split(exp), s => !string.IsNullOrEmpty(s)); Console.WriteLine(context.Connection.RemoteIpAddress + $" - {exp}"); try { var result = EvalExpression(tokens); return result.ToString(CultureInfo.CurrentCulture); } catch (Exception e) { Console.WriteLine(e); return "error"; } }); app.Run(); double EvalExpression(string[] tokens) { var values = new Stack<double>(); var operators = new Stack<string>(); foreach (var token in tokens) { if (double.TryParse(token, out double value)) { values.Push(value); } else { while (operators.Count > 0 && HasPrecedence(token, operators.Peek())) { ApplyOperator(values, operators.Pop()); } operators.Push(token); } } while (operators.Count > 0) { ApplyOperator(values, operators.Pop()); } return values.Pop(); } static bool HasPrecedence(string op1, string op2) { var precedence = new Dictionary<string, int> { {"+", 1}, {"-", 1}, {"*", 2}, {"/", 2}, {"^", 3}, {"%", 3} }; return precedence[op1] <= precedence[op2]; } static void ApplyOperator(Stack<double> values, string op) { var right = values.Pop(); var left = values.Pop(); switch (op) { case "+": values.Push(left + right); break; case "-": values.Push(left - right); break; case "*": values.Push(left * right); break; case "/": values.Push(left / right); break; case "^": values.Push(Math.Pow(left, right)); break; case "%": // values.Push(left * (right / 100)); values.Push(left / 100); break; } } partial class Program { [GeneratedRegex(@"(\d+\.?\d*)|([-+*/^%])")] private static partial Regex MyRegex(); }