可能重複:
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?
可能重複:
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?
您需要一個數學表達式解析器。我認爲最好的方法是不能重新發明輪子。現有的開源解決方案NCalc是一個不錯的選擇。
+1爲簡明扼要,正確,完整包括一個例子。我真的想要一個開源的解決方案。除非你想學習如何編程這樣的東西。然後,我會添加對Niklaus Wirth的「編譯器構建」一書的參考。 – TheBlastOne 2010-11-12 12:20:33
首先將其轉換爲表達式樹。如果你使用內置的Expression類,你可以得到一個免費的編譯方法,它給你一個編譯的委託,因此它的評估速度非常快。如果您想評估不同參數的表達式,這非常有用。
Knuth的經典方法是首先將中綴表達式轉換爲後綴表達式,然後評估後綴表達式,請參閱link text。這兩個步驟都使用Stack來完成大部分的處理,而且相當容易。
使用IronPython的:
ScriptEngine engine = PythonSingleton.Instance.ScriptEngine;
ScriptSource source =
engine.CreateScriptSourceFromString(code, SourceCodeKind.Expression);
Object res = source.Execute();
(從this article複製的代碼)
添加[
,]
因爲裏面的字符串的開始和結束然後運營商:
讀取數字填補他們在堆棧和讀取操作符並進行同樣的操作,當您在堆棧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
這是一個黑客位的,但我通過使用JavaScript的eval功能在.NET:
var myEngine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
string result = Microsoft.JScript.Eval.JScriptEvaluate(expression, myEngine).ToString();
作爲一個額外的獎勵,你可以混合在你的表達式的數學功能,如果需要
「做它?這是什麼意思? – 2010-11-12 09:06:50
@Liviu M. - 我猜他想要計算嵌入到字符串中的表達式的結果。 – 2010-11-12 09:07:33
@ØyvindBråthen,是的,你是對的 – 2010-11-12 09:08:35