Я пытаюсь увидеть, нажал ли пользователь десятичный разделитель в текстовом поле, и разрешить или запретить его в зависимости от других параметров.
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 объединяется с помощью OR с флагом 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));
}
Последнее замечание: согласно Перечисление ключей, значение 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;
}
}
Это не дает ответа на вопрос, если учесть: «NumberdecimalSeparator возвращает значение 46 или '.' в моей системе в США. Во многих других странах в качестве разделителя используется символ ",". Событие KeyDown устанавливает для KeyValue значение 190, когда я нажимаю точку ". ... как написано в вопросе.