Вычисление строки текстового поля формы C # с помощью datatable () - PullRequest
0 голосов
/ 08 октября 2018

Я только начал работать с C # неделю назад (программировал на C ++, как 2,5 года), а сегодня я запустил свое первое приложение для форм.Это простой калькулятор.

Итак, у меня есть форма с кнопками 0-9;+; -; *; / (и еще немного, но они не интересны для этой проблемы) и одно многострочное текстовое поле.Если пользователь нажимает кнопку, определенный символ или цифра записывается непосредственно в текстовое поле вывода.Так что входная часть работает нормально.

Проблема в расчетной части.Код для этой части:

DataTable dt = new DataTable();
        double result = (double)dt.Compute(output.Text.ToString(), "");
        output.AppendText($" ={result.ToString()}");

Если я запускаю его, я получаю эту ошибку:

*System.InvalidCastException
  HResult=0x80004002
  Message=Specified cast is not valid.
  Source=SimpleCalculator
  StackTrace:
   at SimpleCalculator.Form1.result_Click(Object sender, EventArgs e) in C:\Users\Max\Documents\C#\Projects\SimpleCalculator\SimpleCalculator\Form1.cs:line 105
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at SimpleCalculator.Program.Main() in* 

Так что интересная вещь плохо изменила его на int 32 (чтосообщение об ошибке гласит)

double result = (int32)dt.Compute(output.Text.ToString(), "");

работает нормально до двойных значений, затем переходит к ошибке (что такое логика), но если я изменяю его обратно, чтобы удвоить его работу.

double result = (double)dt.Compute(output.Text.ToString(), "");

Я немного озадачен этим, потому что я ничего не изменил в коде, и ошибка иногда возвращается.

Я имею в виду, да, это работает, но недостаточно чисто для меня.Я хочу иметь код без каких-либо шансов на ошибку.

Я использую сообщество Visual Studio 2017, это из-за VB или из-за плохого кода?

Ответы [ 4 ]

0 голосов
/ 08 октября 2018

Вы получаете ошибку, потому что Datatable.Compute возвращает объект, который содержит текст.В C # преобразование текста в число не будет компилироваться, поскольку компилятор не может преобразовать текст в число.Текст может содержать не только цифры, но и любой символ.Вам нужно будет использовать Convert.To()

Если вас интересует эта проблема, вы можете прочитать вопрос о разнице между приведением и использованием Convert.

В вашем коде, еслиВы меняете строку

 double result = (double)dt.Compute(output.Text.ToString(), "");

на

 double result = Convert.ToDouble(dt.Compute(output.Text.ToString(), ""));

, она должна работать нормально.

0 голосов
/ 08 октября 2018

Вам нужно использовать double.DataTable.Compute поддерживает несколько операторов, и результатом иногда является целое число, а иногда double.Поэтому используйте больший тип, который работает всегда: double.

. Возвращает int:

new DataTable().Compute("1+1", null)  // 2 int

и возвращает double:

new DataTable().Compute("1/1", null) // 1.0 double

Вы можете использовать System.Convert.To.Double:

System.Convert.ToDouble(new DataTable().Compute("1+1", null));

Операторы, правила и синтаксис объяснены здесь

0 голосов
/ 08 октября 2018

Я знаю о синтаксисе этой функции, это не проблема;эта ошибка возникает только иногда (с помощью целочисленного возврата).

Сейчас я попробую разрешение kaffekopps и приму его ответ.Если ошибка вернется, я снова открою этот вопрос.

0 голосов
/ 08 октября 2018

Вы можете использовать класс Convert вместо приведения.Пример:

double result = Convert.ToDouble(dt.Compute(output.Text.ToString(), ""));
...