如何在KeyDown事件中检测NumberDecimalSeparator(C#)
我正在尝试查看用户是否在文本框中按了小数点分隔符,并根据其他参数允许或禁止它。
NumberdecimalSeparator返回46或’。’ 在我的美国系统上。 许多其他国家使用’,’作为分隔符。 当我按下句点时,KeyDown事件将KeyValue设置为190。
我只是继续寻找逗号/句号,还是有更好的方法?
电话
CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator
获取当前用户界面文化的小数分隔符。 您可以使用其他文化来获取其他语言的分隔符。
编辑
从我的系统中报告的166种文化( CultureInfo.GetCultures(CultureTypes.SpecificCultures).Count()
)中,似乎只使用了两个分隔符:句点和逗号。 您可以在您的系统中尝试:
var seps = CultureInfo.GetCultures(CultureTypes.SpecificCultures) .Select(ci => ci.NumberFormat.NumberDecimalSeparator) .Distinct() .ToList();
假设这是真的,这个方法可能会有所帮助(请注意, keyCode
与modifiers
标志进行OR运算以消除无效组合):
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枚举 ,您提到的值46对应于DEL(删除)键(即Num Lock为OFF时的点)。
这里的问题是KeyEventArgs
中的值是键代码,而不是字符。 如果您处理KeyPress
,您将在KeyPressEventArgs
获得一个可用于比较的字符。
注意:您应该比较NumberDecimalSeparator
字符,因为它是一个字符串,而不是单个字符,因此您需要考虑字符串中有多个字符的情况。