2011-01-06 42 views
5

Tôi đang làm việc trên một ứng dụng trong C# mà tôi muốn tính toán một biểu thức số học được cho dưới dạng một chuỗi. Vì vậy, giống như tôi nhận được một chuỗi:đánh giá biểu thức số học được lưu trữ trong một chuỗi (C#)

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

Và tôi muốn tính toán kết quả của biểu thức số học. Trong khi ở một ngôn ngữ như Javascript, PHP, vv bạn chỉ có thể sử dụng Eval để làm các trick này doesnt dường như là một lựa chọn trong C#.

Tôi cho rằng có thể viết mã để chia nó thành vô số các biểu thức đơn giản, tính chúng và thêm chúng lại với nhau nhưng điều này sẽ mất khá nhiều thời gian và tôi có nhiều rắc rối trong nỗ lực của tôi .

Vì vậy ... câu hỏi của tôi, Có cách nào đơn giản để thực hiện việc này không?

+1

bản sao có thể có của [C# Math calculator] (http://stackoverflow.com/questions/2859111/c-math-calculator) –

+0

có thể trùng lặp của [Cách tốt nhất và ngắn nhất để đánh giá biểu thức toán học] (http: // stackoverflow .com/questions/1437964/best-and-shortest-way-to-evaluation-toán-biểu thức) –

Trả lời

5

Có một thư viện javascript bạn có thể tham khảo, sau đó chỉ cần làm điều gì đó như:

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

Chỉnh sửa; Thư viện là Microsoft.JScript

+0

trông rất hứa hẹn, đây là lần đầu tiên tôi thử nghiệm. Cảm ơn mọi người vì sự giúp đỡ nhanh và tuyệt vời này = D – user6

+1

VS2010 nói: Microsoft.JScript.Vsa.VsaEngine không được dùng nữa. – Sam

5

Bạn chỉ có thể gọi hàm JScript.NET eval. Bất kỳ ngôn ngữ .NET nào cũng có thể gọi vào bất kỳ ngôn ngữ nào khác.

0

Bạn cần triển khai bộ đánh giá biểu thức. Nó khá đơn giản nếu bạn có nền, nhưng nó không phải là "đơn giản". Đánh giá trong môi trường giải nghĩa thực sự chạy lại trình phân tích cú pháp ngôn ngữ trên chuỗi; bạn cần mô phỏng hoạt động đó, đối với các bit bạn quan tâm, trong mã C# của bạn.

Tìm kiếm "trình đánh giá biểu thức" và "trình phân tích cú pháp gốc đệ quy" để bắt đầu.

3

Xem câu trả lời này:

C# Math calculator

+3

Điều này thực sự nên là một cuộc bỏ phiếu để đóng chứ không phải là cố gắng thu thập đại diện ... –

+1

http: //blog.stackoverflow. com/2011/01/the-wikipedia-of-long-tail-programming-questions/ –

-1

Hãy thử một cái gì đó như thế này:

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

var myStringSum = mySum.toString(); 
+0

Ông muốn về cơ bản trái ngược với điều đó. Biểu thức được lưu trữ trong một chuỗi. –

+0

mặc dù tôi đánh giá cao nỗ lực sẽ dẫn đến một chuỗi chứa 332. – user6

0

Nếu bạn có Bjarne Stroustrup của C++ Programming Language, trong chương 6, ông giải thích từng bước (trong C++) làm thế nào để thực hiện chính xác những gì Chris Tavares gợi ý.

Thật đơn giản nhưng hơi khó chịu nếu bạn không quen với quy trình.

0

tôi cần phải làm điều gì đó tương tự cho một projectand undergrad Tôi thấy điều này

Reverse Polish Notation In C#

Hướng dẫn và mã là rất có giá trị.

Thực hiện khá nhiều việc chuyển đổi chuỗi thành Ký hiệu đánh bóng Ba Lan sau đó đánh giá nó. Nó rất dễ sử dụng, hiểu và thêm các chức năng mới. Mã nguồn được bao gồm.

2

Tôi đã sử dụng NCalc với thành công lớn. Nó cực kỳ linh hoạt và cho phép các biến trong công thức của bạn.Công thức bạn liệt kê trong câu hỏi của bạn có thể được đánh giá dễ dàng như sau:

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

Bạn đã xem http://ncalc.codeplex.com?

Tính năng mở rộng, nhanh chóng (ví dụ: có bộ nhớ cache riêng) cho phép bạn cung cấp các hàm và biến tùy chỉnh tại thời gian chạy bằng cách xử lý sự kiện EvaluateFunction/EvaluateParameter. Các biểu thức mẫu có thể phân tích cú pháp:

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()); 

Nó cũng xử lý unicode & nhiều kiểu dữ liệu nguyên bản. Nó đi kèm với một tập tin antler nếu bạn muốn thay đổi ngữ pháp. Ngoài ra còn có một ngã ba hỗ trợ MEF để tải các chức năng mới.

Nó cũng hỗ trợ toán tử logic, chuỗi ngày/giờ và nếu câu lệnh.

Các vấn đề liên quan