2015-04-10 15 views
8

Niedawno natknąłem się na sposób oceny wyrażenia w języku C# za pomocą metody obliczeniowej obiektu podlegającego walidacji. Oto fragment kodu:Wartość obliczeniowa DataTable jest zbyt duża lub zbyt mała dla typu 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()); 

Jeśli umieścisz prostego wyrażenia jak „300 * 2” to będzie działać, jednak wyrazem powrotu dużej liczby nie będzie działać, pojawia się komunikat:

"Wartość jest zbyt duża lub zbyt mała dla typu" Int32 "."

Próbowałem zmusić typ do podwojenia, ale z jakiegoś powodu błąd nadal wskazuje coś na typ Int32, który nie jestem pewien skąd pochodzi.

Mała dłoń w tej sprawie?

+0

Na jakiej linii otrzymujesz wyjątek? W trzeciej lub szóstej linii? BTW: Dlaczego nie używasz długiego zamiast podwójnego? –

+0

Otrzymuję błąd na linii czwartej: loDataTable.Columns.Add (loDataColumn); Zdecydowanie mógłbym użyć długiego, ale niczego nie zmienia. – Romain

+1

Spróbuj wpisać liczby 3300000D i 450000D. Musisz zadeklarować podwójne, takie jak double myVal = 3D; Bez D jest liczbą całkowitą. – Sami

Odpowiedz

3

Dołącz „0,0" do wartości w równaniu:

string expression = "330200000.0*450000.0"; 

Jeśli, jak pan powiedział, równanie zostało wprowadzone, ponieważ jest (czyli bez” .0") przez użytkownika, wtedy możesz potrzebować trochę nieprzyjemnych manipulacji sznurkami, aby to osiągnąć. Wpadłem na następujących, chociaż jestem pewien, można to zrobić lepiej:

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

Wyrażenie regularne próbuje wyjaśnić, czy użytkownik ma już umieścić po przecinku na końcu każdy z numerów w ich równaniu.

Powiązane problemy