БлогNot. Visual C++: 3 способа получить число из поля ввода

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 [12941 просмотр]


теги: программирование c++ числа c++/cli

К этой статье пока нет комментариев, Ваш будет первым