Как обнаружить NumberDecimalSeparator в событии KeyDown (C #) - PullRequest
5 голосов
/ 16 октября 2008

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

NumberdecimalSeparator возвращается как 46, или '.' в моей системе США. Многие другие страны используют ',' в качестве разделителя. Событие KeyDown устанавливает KeyValue в 190, когда я нажимаю точку.

Я просто продолжаю искать запятые / точки или есть лучший способ?

Ответы [ 2 ]

9 голосов
/ 16 октября 2008

Звонок

CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator

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


EDIT

Из 166 культур, о которых сообщалось в моей системе (CultureInfo.GetCultures(CultureTypes.SpecificCultures).Count()), кажется, что используются только два разделителя: точка и запятая. Вы можете попробовать это в вашей системе:

var seps = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
            .Select(ci => ci.NumberFormat.NumberDecimalSeparator)
            .Distinct()
            .ToList();

Предполагая, что это правда, этот метод может быть полезен (обратите внимание, что keyCode имеет ИЛИ с флагом modifiers для исключения недопустимых комбинаций):

    private bool IsDecimalSeparator(Keys keyCode, Keys modifiers)
    {
        Keys fullKeyCode = keyCode | modifiers;
        if (fullKeyCode.Equals(Keys.Decimal))          // value=110
            return true;

        string uiSep = CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator;
        if (uiSep.Equals("."))
            return fullKeyCode.Equals(Keys.OemPeriod); // value=190
        else if (uiSep.Equals(","))
            return fullKeyCode.Equals(Keys.Oemcomma);  // value=188
        throw new ApplicationException(string.Format("Unknown separator found {0}", uiSep));
    }

Последнее примечание: в соответствии с Перечисление ключей указанное вами значение 46 соответствует клавише DEL (Удалить) (т. Е. Точке, когда Num Lock выключен).

0 голосов
/ 16 октября 2008

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

Примечание. Вы должны действительно сравнить символы NumberDecimalSeparator, так как это строка, а не один символ, поэтому вам необходимо рассмотреть сценарии, в которых в строке более одного символа.

...