如何检测KeyDown事件中的NumberDecimalSeparator(C#)

时间:2008-10-15 21:38:23

标签: c# internationalization keyboard-events culture

我正在尝试查看用户是否在文本框中按了小数点分隔符,并根据其他参数允许或禁止它。

NumberdecimalSeparator返回46或'。'在我的美国系统上。许多其他国家使用','作为分隔符。当我按下句号时,KeyDown事件将KeyValue设置为190.

我只是继续寻找逗号/句号,还是有更好的方法?

3 个答案:

答案 0 :(得分:9)

电话

CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator

获取当前用户界面文化的小数分隔符。您可以使用其他文化来获取其他语言的分隔符。


修改

在我的系统(CultureInfo.GetCultures(CultureTypes.SpecificCultures).Count())中报告的166种文化中,似乎只使用了两个分隔符:句点和逗号。您可以在系统中尝试:

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

假设这是真的,此方法可能会有所帮助(请注意,keyCodemodifiers标志进行“或”运算以消除无效组合):

    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));
    }

最后一点:根据Keys enumeration,您提到的值46对应于DEL(删除)键(即Num Lock为OFF时的点)。

答案 1 :(得分:0)

这里的问题是KeyEventArgs中的值是关键代码,而不是字符。如果您处理KeyPress,您将在KeyPressEventArgs中获得一个可用于比较的字符。

注意:您应该真正比较NumberDecimalSeparator个字符,因为它是一个字符串,而不是单个字符,因此您需要考虑字符串中有多个字符的情况。

答案 2 :(得分:0)

如果您需要知道所按下的字符是否为小数点分隔符:

private void Control_KeyPress(object sender, KeyPressEventArgs e)
{
    char separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
    if (e.KeyCahr == separador)
    {
        // true
    }
    else
    {
        // false
    }
}

但是,如果您需要接受十进制小键盘数字键作为任何区域性的十进制分隔符:

    private bool decimalSeparator = false;
    private void Control_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Decimal)
            decimalSeparator = true;
    }

    private void Control_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (decimalSeparator)
        {
            e.KeyChar = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
            decimalSeparator = false;
        }
    }