Преамбула
Продолжаем разговор о вводе чисел в TextBox
. Сегодня будем вводить отрицательные числа, тобишь к числу (точнее строке) надо будет пририсовывать знак «минус».
Главное
Раз уж мы будем что-то в TextBox
добавлять, то изменится длина строки в TextBox
, а, соответственно текстовый курсор (|) перепрыгнет с позиции, на которой он находился, на следующую или предыдущую, что создаст неудобство пользователю. Это надо побороть.
Позицию курсора можно вытащить из свойства TextBox.SelectionStart
, посему сохраним его перед началом всех действий с текстом в отдельную переменную:
int pos = txt.SelectionStart;
Теперь можно вводить знак числа.
Ввод знака числа
Смотрим, какой символ был введен. Если минус, то проверяем, был ли в начале строки минус. Был — убираем, не было — добавляем. В зависимости от того, убрали или добавили символ, корректируем местоположение текстового курсора, добавляя или удаляя позицию, если, соответственно, убрали или добавили символ.
//ввод минуса
if (e.KeyChar == '-')
{
if (txt.Text.StartsWith("-"))
{
txt.Text = txt.Text.Substring(1);
txt.SelectionStart = pos - 1;
}
else
{
txt.Text = "-" + txt.Text;
txt.SelectionStart = pos + 1;
}
e.Handled = true;
return;
}
Дополнительно. Добавление лидирующего ноля.
Таким же образом можно добавлять лидирующий ноль, если пользователь начал ввод дробного числа с точки:
//ввод точки (запятой)
if ((txt.Text.StartsWith(".")) || (txt.Text.StartsWith(",")))
{
// добавление лидирующего ноля
txt.Text = "0" + txt.Text;
txt.SelectionStart = pos + 1;
}
if ((e.KeyChar == '.') || (e.KeyChar == ','))
{
if (txt.Text.Contains(".") || txt.Text.Contains(","))
{
e.Handled = true;
return;
}
return;
}
Вся функция целиком
На PasteBin
Дополнительно
1. Ввод в текстовое поле только цифр Копия
2. Ввод дробных чисел в текстовое поле Копия
Общий пример для всех заметок
— Ввод цифр
— Ввод чисел с дробной частью
— Ввод отрицательных чисел с дробной частью и добавление лидирующего ноля
— Дополнительно — пример конверсии вводимых строк в числа, обработка ошибок при конвертации.
На GitHub