текстовое поле, чтобы принять только числовые значения - PullRequest
0 голосов
/ 25 апреля 2011

пользователю должно быть разрешено вводить только десятичные значения в текстовое поле

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

@"^((\+|-)?(\d*))+((\.|,)\d{0,5})?$";

намерение здесьдля ограничения десятичных разрядов до 6.

, используется в качестве десятичного разделителя для европейских языков

формат чисел может быть

+100, 100
-100
.12
10.12 .....

, если выражениевведенный в моде работает отлично

предположим, что введенные значения в текстовом поле 100.123456 теперь, если хотите изменить вышеуказанное значение, как показано ниже

1100.123456
1001.123456

я не могу изменить, потому что Regex.IsMatch возвращает false, если regex.ismatch возвращает false, я подавляю ключевые события

, почему regex.ismatch возвращает false, когда 100.123456 изменено на 1100.123456, нужно ли мне изменять регулярное выражение

Ответы [ 4 ]

0 голосов
/ 25 апреля 2011

Позвольте мне предвосхитить этот ответ, сказав: это та вещь, которая, вероятно, лучше всего обрабатывается сторонним контролем.Таким образом, решение полностью обрабатывает угловые случаи и необходимое тестирование.

Событие KeyDown сработает до изменения текста в элементе управления.Если вы сравниваете значение текстового поля .Text в своем регулярном выражении, у него не будет нового значения.

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

(С реквизитом на C # Как перевести виртуальный код ключа на символ? )

[DllImport("user32.dll")]
static extern int MapVirtualKey(uint uCode, uint uMapType);

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    string number = textBox1.Text;

    if ((e.KeyData & Keys.Delete) == Keys.Delete)
    {

    }
    else if ((e.KeyData & Keys.Back) == Keys.Back)
    {

    }
    else
    {
        // 2 is used to translate into an unshifted character value 
        int nonVirtualKey = MapVirtualKey((uint)e.KeyData, 2);
        char mappedChar = Convert.ToChar(nonVirtualKey);

        string proposedString = number.Remove(textBox1.SelectionStart, textBox1.SelectionLength).Insert(textBox1.SelectionStart, mappedChar.ToString());

        bool works = Regex.IsMatch(proposedString, @"^((\+|-)?(\d*))+((\.|,)\d{0,5})?$");

        e.SuppressKeyPress = !works;
    }
}
0 голосов
/ 25 апреля 2011

Я бы не совпал с регулярным выражением, просто сделаю Double.TryParse, и если он правильно анализирует, используйте это число.

Есть ли причина, по которой вам нужно точно соответствовать RegEx?

0 голосов
/ 25 апреля 2011

Если вы хотите ограничить число после десятичной точки до 6, разве вы не должны использовать регулярное выражение

^((\+|-)?(\d*))+((\.|,)\d{0,6})?$

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

0 голосов
/ 25 апреля 2011

Разве вы не можете просто установить атрибут или свойство текстового поля, чтобы оно принимало только числовой ввод?

...