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

标签 c# internationalization keyboard-events culture

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

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

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

最佳答案

电话

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

关于c# - 如何检测 KeyDown 事件中的 NumberDecimalSeparator (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/206608/

相关文章:

c# - 从 Visual Studio 2017 RC 降级到 Visual Studio 2015 的解决方案

c# - 使用 linq 赋值

c# - 想知道线程理论

perl - url语言前缀的催化剂最佳方式?

c# - 在运行时向 RibbonDropDown 添加项目

jsp - 在带有 Spring 的 JSP 中使用什么进行本地化?

java - 机器人:摆脱 "warning: unmappable character for encoding ascii"

c - 在没有窗口焦点的情况下检测 Windows 上的按键

javascript - 以编程方式发送键盘事件不会将它们分派(dispatch)到输入中

c++ - 如何在 MacOS 上检测 C++ 中的按键?