簡體   English   中英

計算存儲在字符串(C#)中的算術表達式

[英]evaluate an arithmetic expression stored in a string (C#)

我正在使用C#中的一個應用程序,在該應用程序中我想計算以字符串形式給出的算術表達式。 所以就像我得到一個字符串:

string myExpr="4*(80+(5/2))+2";

我想計算算術表達式的結果。 當使用Javascript,PHP等語言時,您可以使用Eval來解決問題,這似乎不是C#中的選項。

我想可以編寫代碼將其划分為無數個簡單表達式,然后將它們計算並添加在一起,但這將花費相當長的時間,而在這樣做的過程中可能會遇到很多麻煩。

所以...我的問題是,有什么“簡單”的方法嗎?

您可以只調用JScript.NET eval函數。 任何.NET語言都可以調用任何其他語言。

您可以參考一個JavaScript庫,然后執行以下操作:

var engine = VsaEngine.CreateEngine();
Eval.JScriptEvaluate(mySum, engine);

編輯; 庫是Microsoft.JScript

您看過http://ncalc.codeplex.com嗎?

它可擴展,快速(例如,具有自己的緩存)使您能夠通過處理EvaluateFunction / EvaluateParameter事件在運行時提供自定義函數和變量。 它可以解析的示例表達式:

Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)");

  e.Parameters["Pi2"] = new Expression("Pi * Pi");
  e.Parameters["X"] = 10;

  e.EvaluateParameter += delegate(string name, ParameterArgs args)
    {
      if (name == "Pi")
      args.Result = 3.14;
    };

  Debug.Assert(117.07 == e.Evaluate());

它還可以本地處理unicode和許多數據類型。 如果要更改語法,它附帶一個鹿角文件。 還有一個支持MEF加載新功能的fork。

它還支持邏輯運算符,日期/時間的字符串和if語句。

看到這個答案:

C#數學計算器

我使用NCalc取得了巨大的成功。 它非常靈活,可以在公式中包含變量。 您在問題中列出的公式可以很容易地進行評估:

string myExpr = "4*(80+(5/2))+2";
decimal result = Convert.ToDecimal(new Expression(myExpr).Evaluate());

您需要實現一個表達式計算器。 如果您有背景,那將是相當簡單的,但並非“簡單”。 解釋環境中的Eval實際上會在字符串上重新運行語言解析器。 您需要在C#代碼中針對您關心的位模擬該操作。

搜索“表達式評估器”和“遞歸下降解析器”以開始使用。

如果您有Bjarne Stroustrup的C ++編程語言 ,在第6章中,他將逐步(以C ++方式)解釋Chris Tavares所建議的方法。

這很簡單,但是如果您不熟悉該過程,則會有些煩惱。

我需要為本科生項目做類似的事情,我發現了這一點

C#中的反向波蘭語表示法

教程和代碼非常有價值。

它幾乎只是一種將字符串轉換為反向波蘭符號然后對其進行評估的實現。 它非常易於使用,理解和添加新功能。 包含源代碼。

嘗試這樣的事情:

int mySum = 4*(80+(5/2))+2;

var myStringSum = mySum.toString();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM