Преобразование строкового выражения к Целочисленному значению с помощью C# [дубликат]

11
задан CAbbott 9 April 2010 в 13:33
поделиться

5 ответов

Используйте NCalc : стабильный, простой и мощный

6
ответ дан 3 December 2019 в 07:11
поделиться

Fwiw, в .NET framework встроен синтаксический анализатор выражений. Его использует метод DataTable.Compute () :

using System;
using System.Data;

class Program {
    static void Main(string[] args) {
        var expr = "10 + 20 + 30";
        var result = new DataTable().Compute(expr, null);
        Console.WriteLine(result);
        Console.ReadLine();
    }
}

Однако учтите, что это не очень полнофункциональный метод. Только простые выражения, которые можно найти в запросе SQL.

5
ответ дан 3 December 2019 в 07:11
поделиться

Вам нужно разобрать строку, разделяя числа и операторы (+,-,*,/ и т.д.). Числа можно преобразовать в целые или десятичные числа с помощью команд .TryParse (например, Int32.TryParse()). Операторы можно обрабатывать с помощью оператора switch. Чем сложнее типы выражений, которые вы хотите иметь возможность обрабатывать, тем сложнее это будет сделать. Вы можете использовать рекурсию для обработки подвыражений в круглых скобках.

Edit: Я собирался найти некоторые примеры статей, но вижу, что Одед уже разместил некоторые из них.

0
ответ дан 3 December 2019 в 07:11
поделиться

В .NET ничего не встроено, поэтому вам придется использовать парсер математических выражений и использовать его для получения результата.

Вот один из них. И пара статей.

6
ответ дан 3 December 2019 в 07:11
поделиться

Возможно, используйте библиотеку сценариев - IronPython (python), cs-script (c #) или даже MSScriptControl (VBscript) - затем вы можете передать свое строковое выражение в библиотеку для оценки.

Пример использования MSScript Control:

с использованием MSScriptControl;

...

ScriptControl ScriptEngine = new ScriptControlClass ();

ScriptEngine.Language = "VBScript";

string expr = "10 + 20 + 30 ";

объект result = ScriptEngine.Eval (expr);

decimal d = Convert.ToDecimal (результат);

0
ответ дан 3 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: