2015-04-10 15 views
8

Gần đây tôi đã xem xét một cách để đánh giá biểu thức trong C#, bằng cách sử dụng phương pháp tính toán của một đối tượng có thể đặt dữ liệu. Dưới đây là một đoạn mã:Giá trị tính toán DataTable quá lớn hoặc quá nhỏ đối với loại Int32

string expression = "330200000*450000"; 
    var loDataTable = new DataTable(); 
    var loDataColumn = new DataColumn("Eval", typeof(double), expression); 
    loDataTable.Columns.Add(loDataColumn); 
    loDataTable.Rows.Add(0); 
    MessageBox.Show(((double)(loDataTable.Rows[0]["Eval"])).ToString()); 

Nếu bạn đặt một biểu thức đơn giản như "300 * 2" này sẽ làm việc, tuy nhiên một biểu thức trả về một số lượng lớn sẽ không làm việc, tôi nhận được thông báo:

"Giá trị quá lớn hoặc quá nhỏ đối với Loại 'Int32'."

Tôi đã cố buộc loại tăng gấp đôi, nhưng vì một lý do nào đó, lỗi vẫn trỏ đến thứ gì đó liên quan đến loại Int32 mà tôi không chắc nó đến từ đâu.

Một chút về điều đó?

+0

Bạn nhận được ngoại lệ trên dòng nào? Trong dòng thứ 3 hoặc thứ 6? BTW: Tại sao bạn không sử dụng dài thay vì gấp đôi? –

+0

Tôi gặp lỗi trên dòng thứ 4: loDataTable.Columns.Add (loDataColumn); Tôi chắc chắn có thể sử dụng lâu, nhưng nó không thay đổi bất cứ điều gì. – Romain

+1

Hãy thử viết các số 3300000D và 450000D. Bạn cần khai báo gấp đôi như double myVal = 3D; Nếu không có D thì đó là một số nguyên. – Sami

Trả lời

3

Nối ".0" để các giá trị trong phương trình của bạn:

string expression = "330200000.0*450000.0"; 

Nếu, như bạn nói, phương trình đã được nhập vì nó là (tức là nếu không có sự" 0,0") bởi người sử dụng, sau đó bạn có thể phải tham gia vào một số thao tác chuỗi mơ hồ khó chịu để đạt được điều này. Tôi đã đưa ra những điều sau đây, mặc dù tôi chắc chắn rằng điều đó có thể được thực hiện tốt hơn:

string expression = "330200000*450000"; // or whatever your user has entered 
expression = Regex.Replace(
    expression, 
    @"\d+(\.\d+)?", 
    m => { 
     var x = m.ToString(); 
     return x.Contains(".") ? x : string.Format("{0}.0", x); 
    } 
); 
var loDataTable = new DataTable(); 
var computedValue = loDataTable.Compute(expression, string.Empty); 

Cụm từ thông dụng cố gắng tính toán người dùng đã đặt số thập phân vào cuối bất kỳ số nào hay không trong phương trình của họ.

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