Ограничение числа после запятой при нажатии клавиши

Я использую следующий код, чтобы брать только цифры от пользователя и только одну десятичную точку, которая отлично работает для меня в событии KeyPress:

if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
{
    e.Handled = true;
}

if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1)
{
    e.Handled = true;
}

Теперь я хочу ограничить числа/цифры после десятичной точки/точки, т.е. 35.25468, что означает, что после точки/десятичной точки требуется только 6 цифр/цифр.

Обнови меня!


person Shahid Ghafoor    schedule 31.08.2011    source источник
comment
Хотя это возможно, я бы решительно возражал против этого, поскольку пользователей очень раздражает, если они пытаются редактировать поле. Это также значительно усложняет ваш код. Будет лучше, если вы пройдете проверку после того, как пользователь покинет поле или отправит форму. Используйте встроенные средства проверки. Вот для чего это нужно.   -  person Jim Mischel    schedule 31.08.2011


Ответы (6)


private void price_tb_KeyPress(object sender, KeyPressEventArgs e)
        {

        if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
        {
            e.Handled = true;
        }

        // only allow one decimal point
        if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1)
        {
            e.Handled = true;
        }

        if (!char.IsControl(e.KeyChar))
        {

        TextBox textBox = (TextBox)sender;

        if (textBox.Text.IndexOf('.') > -1 &&
                 textBox.Text.Substring(textBox.Text.IndexOf('.')).Length >= 3)
        {
            e.Handled = true;
        }

        }

    }

Этот код поможет вам. Он занимает только один десятичный знак и две цифры после одного десятичного знака, и вы можете изменить его соответствующим образом.

person Both FM    schedule 21.09.2011

вы можете добавить дополнительную проверку, как это

TextBox textBox = (TextBox) sender;

if (textBox.Text.IndexOf('.') > -1 &&
         textBox.Text.Substring(textBox.Text.IndexOf('.')).Length >=3)
{
    e.Handled = true;
}

Обратите внимание, подстрока будет включать '.' и, следовательно, проверка >=3.

person Bala R    schedule 31.08.2011

В событии нажатия клавиши и/или подтверждения события подсчитайте количество символов после запятой. При нажатии клавиши подавить его. при проверке удалите лишние десятичные знаки. Убедитесь, что вы получаете символ десятичной точки из NumberFormatInfo, не все культуры используют «.», т.е. во Франции их десятичная точка на самом деле является запятой

person Mark Menchavez    schedule 31.08.2011
comment
Убедитесь, что вы получаете символ десятичной точки из NumberFormatInfo, не все культуры используют «.», т.е. во Франции их десятичная точка на самом деле является запятой - person Mark Menchavez; 31.08.2011

При нажатии клавиши отформатируйте строку и установите textBox.Text в отформатированную строку.

TextBox.Text = String.Format("{0:N3"}", textBox.Text)

Этот конкретный формат обрезает число до 3-го десятичного знака.

person N_A    schedule 31.08.2011

У меня было textBox.SelectionLength == 0, чтобы разрешить изменение выделенного текста:

private void price_tb_KeyPress(object sender, KeyPressEventArgs e) {
    if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.') {
        e.Handled = true;
    }
    TextBox textBox = (TextBox)sender;
    // only allow one decimal point
    if (e.KeyChar == '.' && textBox.Text.IndexOf('.') > -1) {
        e.Handled = true;
    }
    if (!char.IsControl(e.KeyChar) && textBox.SelectionLength == 0) {
        if (textBox.Text.IndexOf('.') > -1 && textBox.Text.Substring(textBox.Text.IndexOf('.')).Length >= 3) {
            e.Handled = true;
        }
    }
}
person Kevin.Debeil    schedule 22.10.2012

Проблема, с которой я столкнулся в ответе Both FM, заключается в том, что вы не можете редактировать текст, если вы ввели десятичный знак и два десятичных знака.

Этот код также принимает минус сумму.

    private void TextBoxAmount_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (char.IsDigit(e.KeyChar))
        {
            // OK, but not more than 2 after the [.]
            if (((TextBox)sender).Text.Contains('.'))
            {
                if (((TextBox)sender).Text.IndexOf('.') + 2 < ((TextBox)sender).Text.Length)
                {
                    if (((TextBox)sender).SelectionStart > ((TextBox)sender).Text.IndexOf('.'))
                    {
                        e.Handled = true;
                    }
                }
            }
        }
        else if (char.IsControl(e.KeyChar))
        {
            // Always OK
        }
        else if (e.KeyChar == '.' && !((TextBox)sender).Text.Contains('.'))
        {
            // First [.] == OK
        }
        else if (e.KeyChar == '-' && !((TextBox)sender).Text.Contains('-'))
        {
            // First [-] == OK
        }
        else
        {
            e.Handled = true;
        }
    }


    private void TextBoxAmount_KeyUp(object sender, KeyEventArgs e)
    {
        if (((TextBox)sender).Text.Contains('-'))
        {
            ((TextBox)sender).Text = $"-{((TextBox)sender).Text.Replace("-", string.empty)}";
        }
    }
person Jos R.    schedule 07.07.2020