Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Ввод только чисел


Автор: inkognitum 28.7.2008, 09:50
Добрый день.

Не подскажите как в поле ввода (textBox) разрешить ввобдить только числа, сложность в том что числа не обязательно целые, например (10,07)


Заранее спасибо.

Автор: Partizan 28.7.2008, 10:15
inkognitum, отлавливать textchanged и делать там Decimal.TryParse();

Автор: Alekz 28.7.2008, 10:36
Можно использовать MaskedTextBox

Автор: Bishop 28.7.2008, 11:14
inkognitum, 
Код
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (Regex.IsMatch(e.KeyChar.ToString(), @"[-\b\d.,]"))  // backspace, цифры, минус, точка и запятая
    {
        if (Regex.IsMatch(e.KeyChar.ToString(), "[.,]")) // заменим на системный разделитель целой и дробной части
            e.KeyChar = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
    }
    else
        e.Handled = true;
}

Автор: inkognitum 29.7.2008, 18:18
Всем спасибо!

Автор: jonie 30.7.2008, 08:57
Bishop можно навводить кучу запятых )

Автор: Bishop 30.7.2008, 12:16
jonie, так и задумано. И минусов тоже можно много ввести, и не только в начале числа. Так на самом деле удобней, когда нужно ошибку исправить, запятую например не в той позиции: вначале ставим где надо, потом удаляем где не надо. А ещё там Ctrl+C/Ctrl+V не работают. А мышкой можно вставить что угодно. И вот это плохо.
А лучше не блокировать ввод вообще. Использовать ErrorProvider для индикации ошибок, а окончательную проверку правильности проводить отдельно, перед обработкой. Хотя я бы всё равно делал замену точек и запятых на системный разделитель в KeyPress.
Код
private void textBox1_TextChanged(object sender, EventArgs e)
{
    char ds = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
    errorProvider1.SetError((sender as TextBox), Regex.IsMatch((sender as TextBox).Text, @"^[+-]?\d*(\d"+ds+@")?\d*$") ? "" : "Можно вводить только числа");
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (Regex.IsMatch(e.KeyChar.ToString(), "[.,]"))
        e.KeyChar = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
}
private void button1_Click(object sender, EventArgs e)
{
    double res;
    if (double.TryParse(textBox1.Text, out res))
        MessageBox.Show(res.ToString());
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)