我正在尝试查看用户是否在文本框中按下了小数点分隔符,并根据其他参数允许或禁止它。
NumberdecimalSeparator 返回 46 或 '.' 在我的美国系统上。许多其他国家/地区使用“,”作为分隔符。当我按下句点时,KeyDown 事件将 KeyValue 设置为 190。
我只是继续寻找逗号/句号,还是有更好的方法?
我正在尝试查看用户是否在文本框中按下了小数点分隔符,并根据其他参数允许或禁止它。
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();
假设这是真的,此方法可能会有所帮助(请注意,keyCode
与标志进行或运算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));
}
最后一点:根据Keys enumeration,您提到的值 46 对应于 DEL(删除)键(即 Num Lock 关闭的点)。
这里的问题是 中的值KeyEventArgs
是关键代码,而不是字符。如果您KeyPress
改为处理,您将获得一个KeyPressEventArgs
可用于比较的字符。
注意:您应该真正比较NumberDecimalSeparator
字符,因为它是一个字符串,而不是单个字符,因此您需要考虑字符串中有多个字符的情况。
如果您需要知道按下的字符是否为小数分隔符:
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;
}
}