Ввод в TextBox только чисел

Не предполагал, что в блоге будут статьи про Си-шарп, но куда деваться?

Долгое время пользуюсь маленьким хаком. Раньше не мог найти его в интернете даже на Стэковерфлоу (сейчас не знаю, не искал). Обычное решение проблемы ввода только чисел в текстовое поле состоит в проверке кода каждой нажатой клавиши, причём чаще всего забывают, что число может быть и отрицательным, а в таком случае нужно проверять ещё позицию минуса (как и позицию запятой).

Другое решение состоит в проверке по регулярному выражению, что тоже не всегда удобно.

Я предлагаю использовать самые-самые основные функции Си-шарп. Класс Convert. Его знает большинство, потому что во всех учебниках по языку о нём рассказывается в начале. Думаю, вы уже догадались, какова будет проверка, но тем не менее:

try
{
	double result = Convert.ToDouble(textBox.Text);
}
catch (Exception ex)
{
	// something..
}

Дальше всё просто. Ловите события на текстовом поле и проверяете его содержимое с помощью Convert. Какие могут быть проблемы:

  • Самая очевидная — это проблема с локалью. Вполне может быть, что пользователь введёт не точку, а запятую или наоборот. В таком случае можно проверять дважды с разной локалью.
  • Вторая по очевидности — это проблема с тем, какое событие отлавливать. Можно приспособить этот метод и к KeyPress в Винформах, и к KeyDown/KeyUp в ВПФ. Разница только в подходах и последовательности обработки. Если вам нужна стопроцентная защита, то лучше всего сохранять предыдущее правильное (валидное) значение текстового поля, тогда если оно изменится неподобающим образом, можно будет откатить его назад. Это поможет и от вставки (копи-паста) неверного значения в поле. И это куда лучше, чем удалять последний введённый символ и менять положение курсора.
  • Самая менее очевидная — как показать пользователю, что он ошибся? В таком случае следует отлавливать разные исключения и выдавать разный результат. Например, FormatException — это исключение, генерируемое при неправильном формате числа, а OverflowException, как видно по названию, при выходе за границы типа числа.

Явных минусов у этого способа за пару лет использования я не нашёл. Если их знаете вы — поделитесь.

2014
Популярное