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

Posted

技术标签:

【中文标题】如何在 KeyDown 事件中检测 NumberDecimalSeparator (C#)【英文标题】:How do I detect a NumberDecimalSeparator in a KeyDown event (C#) 【发布时间】:2008-10-15 21:38:23 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

电话

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 关闭时的点)。

【讨论】:

这在考虑时没有回答问题:“NumberdecimalSeparator 返回为 46,或 '。'在我的美国系统上。许多其他国家/地区使用 ',' 作为分隔符。当我按下句点时,KeyDown 事件将 KeyValue 设置为 190。 ...如问题中所述。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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;
        
    

【讨论】:

以上是关于如何在 KeyDown 事件中检测 NumberDecimalSeparator (C#)的主要内容,如果未能解决你的问题,请参考以下文章

OS X:检测系统范围的 keyDown 事件?

keydown,keypress,keyup三者之间的区别

如何在 macOS 上检测 SwiftUI 中的键盘事件?

如何在 macOS 上检测 SwiftUI 中的键盘事件?

如何以编程方式在 ExtJS 4 中触发 keydown 事件

如何在 Swift5 中监听 keydown 事件?