Как я обнаруживаю NumberDecimalSeparator в событии KeyDown (C#)

Опция грубой силы будет заключаться в том, чтобы получить количество вхождений на элемент, а затем отфильтровать этот вывод. Объект collections.Counter прекрасно работает здесь:

l = [a,b,c,c,c,a,d,e,e,d,d]
c = Counter(l)

# Counter looks like {'a': 2, 'b': 1, 'c': 3...}

l = [item for item in l if c[item]>=3]

Под капотом Counter действует как словарь, который вы можете построить себе так:

c = {}
for item in l:
    # This will check if item is in the dictionary
    # if it is, add to current count, if it is not, start at 0
    # and add 1
    c[item] = c.get(item, 0) + 1

# And the rest of the syntax follows from here
l = [item for item in l if c[item]>=3]
5
задан JasonMArcher 20 July 2015 в 20:23
поделиться

2 ответа

Вызов

CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator

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


Править

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

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

Предполагая, что это верно, этот метод может быть полезным (обратите внимание что keyCode OR'ed с 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 ВЫКЛЮЧЕНА).

9
ответ дан 14 December 2019 в 01:20
поделиться

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

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

0
ответ дан 14 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: