2010-11-12 93 views
12

可能重複:
Is there a string math evaluator in .NET?
Best and shortest way to evaluate mathematical expressions執行數學表達式的最佳方法是什麼?

我有一個字符串變量

string exp = "12+34+4*56+(23*45+12)2/30" 

是什麼做的最好的方法是什麼?沒有使用第三方DLL?

+0

「做它?這是什麼意思? – 2010-11-12 09:06:50

+2

@Liviu M. - 我猜他想要計算嵌入到字符串中的表達式的結果。 – 2010-11-12 09:07:33

+0

@ØyvindBråthen,是的,你是對的 – 2010-11-12 09:08:35

回答

17

您需要一個數學表達式解析器。我認爲最好的方法是不能重新發明輪子。現有的開源解決方案NCalc是一個不錯的選擇。

+2

+1爲簡明扼要,正確,完整包括一個例子。我真的想要一個開源的解決方案。除非你想學習如何編程這樣的東西。然後,我會添加對Niklaus Wirth的「編譯器構建」一書的參考。 – TheBlastOne 2010-11-12 12:20:33

4

首先將其轉換爲表達式樹。如果你使用內置的Expression類,你可以得到一個免費的編譯方法,它給你一個編譯的委託,因此它的評估速度非常快。如果您想評估不同參數的表達式,這非常有用。

2

Knuth的經典方法是首先將中綴表達式轉換爲後綴表達式,然後評估後綴表達式,請參閱link text。這兩個步驟都使用Stack來完成大部分的處理,而且相當容易。

2

使用IronPython的:

ScriptEngine engine = PythonSingleton.Instance.ScriptEngine; 
ScriptSource source = 
engine.CreateScriptSourceFromString(code, SourceCodeKind.Expression); 

Object res = source.Execute(); 

(從this article複製的代碼)

1

添加[]因爲裏面的字符串的開始和結束然後運營商:

讀取數字填補他們在堆棧和讀取操作符並進行同樣的操作,當您在堆棧POP先前的操作符中將其值較低或等於先前操作符的操作符豐富時,並按數字堆棧中的可用數字操作: *:3,/:3,):4,+:1, - :1

[12+34+4*56] ==> 
Round 1: Numbers Stack: 12, Operator stack:[ 
Round 2: Numbers Stack: 12, Operator stack:[, +(1) 
Round 3: Numbers Stack:12,34, Operator stack: [,+(1) 
Round 4: Numbers Stack:12,34, Visited new operator with same or lower value (1) remove previous operator and pop 2 number from number stack and operate on them: So 
Round 4: Numbers Stack:46, Operator stack: [,+(1) 
Round 5: Numbers Stack:46,4 , Operator stack: [,+(1) 
Round 6: Numbers Stack:46,4 , Operator stack: [,+(1),*(2) 
Round 7: Numbers Stack:46,4,56, Operator stack: [,+(1),*(2) 
Round 7: Numbers Stack:46,4,56, Operator stack: [,+(1),*(2) now operator item `]` want to be add, and it's priority is lower than all operators so operators sould be remove from stack and by each operator one number going to be removed: 
Round 7: Numbers Stack:46,224 Operator stack: [,+(1), 
Round 8: Numbers Stack:270 Operator stack: [, 
Round 8: return 270, because ']' intered in Operator stack 
+0

這不符合「重塑車輪」嗎?有數十個數值表達式評估器經過了充分測試,得到了很好的支持,並且比那個更強大。編寫另一個用於生產代碼的要點是什麼? – Niki 2010-11-12 09:26:39

+0

@nikie,恕我直言OP想要做它不使用第三方,我也寫這個,因爲算法簡單而有趣。 – 2010-11-12 09:31:50

+0

我同意這個算法很有趣,這是一個很好的編程練習。但它不是生產準備(恕我直言,這是OP想要的)。例如,我看不到任何有關良好語法錯誤的規定(通常是編寫解析器中最難的部分!)。 – Niki 2010-11-12 10:21:17

1

這是一個黑客位的,但我通過使用JavaScript的eval功能在.NET:

var myEngine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine(); 
string result = Microsoft.JScript.Eval.JScriptEvaluate(expression, myEngine).ToString(); 

作爲一個額外的獎勵,你可以混合在你的表達式的數學功能,如果需要

相關問題