Visual C++: 3 способа получить число из поля ввода
Представим, что в проект Visual C++ добавлена форма Form1
и однострочное (свойство Multiline==false
) текстовое поле textBox1
. Нужно проверить, введено ли в поле вещественное число, возможно, содержащее дробную часть. Экспоненциальную ("с буквой e") форму записи вещественных чисел для простоты не рассматриваем.
Возможно, по меньшей мере, 3 способа решения задачи:
Способ 1. Методы класса System::Convert::To<тип>
int n; try { n = System::Convert::ToInt32(textBox1->Text); } catch (...) { MessageBox::Show("Не удалось получить число","Ошибка",MessageBoxButtons::OK); }
Для вещественного числа нужен метод ToSingle
или ToDouble
вместо ToInt32
.
Способ 2. Метод TryParse
float a; bool A = Single::TryParse(textBox1->Text, System::Globalization::NumberStyles::Number, System::Globalization::NumberFormatInfo::CurrentInfo, a); if (A==false) { MessageBox::Show("Нет"); }
Выгодно тем, что информация о формате вещественного числа (например, что отделяет целую часть от дробной - точка или запятая), берётся из системы. Впрочем, так же поступает и код третьего способа.
Способ 3. Проверка на допустимые символы и их последовательность
//Описать глобально после в Form1.h после директивы #pragma endregion String^ TorZ; // Точка или запятая //Обработчик события Load формы Form1 private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { label1->Text = "Можно вводить только цифры!"; // Выясняем что установлено в настройках в качестве разделителя - точка или запятая TorZ = Globalization::NumberFormatInfo::CurrentInfo->NumberDecimalSeparator; } //Обработчик события KeyPress поля ввода textBox1 private: System::Void textBox1_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) { bool TZFound = false; // Разделительный знак найден? String ^ FirstChar; //знаки + и - разрешены первым символом FirstChar = ""; if (textBox1->Text->Length>0) FirstChar = textBox1->Text->Substring(0,1); bool badPosition = (FirstChar == L"-" && textBox1->SelectionStart==0); if (Char::IsDigit(e->KeyChar) == true) { if (badPosition) e->Handled = true; return; //Найдена цифра } if (e->KeyChar == (char)Keys::Back) return; //Найден BackSpace if (e->KeyChar == L'-') { if (FirstChar == L"-") textBox1->Text = textBox1->Text->Substring(1); if (textBox1->SelectionStart==0) return; } if (textBox1->Text->IndexOf(TorZ) != -1) TZFound = true; //Найден разделитель целой и дробной частей if (TZFound == true) { e->Handled = true; return; } //Уже есть, второй не добавляем if (e->KeyChar.ToString() == TorZ && !badPosition) return; //А первый - можно e->Handled = true; //Не разрешать дальнейшую обработку } }; } ///////////////// конец файла Form1.h
Здесь мы подходим к задаче "радикально", контролируя действия пользователя во время ввода с помощью обработчика события KeyPress
, позволяя вводить с клавиатуры только вещественные или целые числа, возможно, со знаком "минус" в первой позиции числа.
На практике нужно обратить внимание, что для ввода чисел есть специально предназначенная для этой цели стандартная компонента NumericUpDown
.
10.02.2015, 13:35 [13311 просмотров]