c# - tecla - keypress visual basic 6
Cómo detecto un NumberDecimalSeparator en un evento KeyDown(C#) (2)
Estoy intentando ver si el usuario ha presionado un separador decimal en un cuadro de texto, y permitirlo o suprimirlo en función de otros parámetros.
NumberdecimalSeparator devuelve 46, o ''.'' en mi sistema de EE. UU. Muchos otros países usan '','' como el separador. El evento KeyDown establece KeyValue en 190 cuando presiono el punto.
¿Simplemente sigo buscando comas / puntos, o hay una mejor manera?
El problema aquí es que los valores en KeyEventArgs
son códigos clave, no caracteres. Si maneja KeyPress
lugar, obtendrá una char en KeyPressEventArgs
que puede usar para la comparación.
Nota: Realmente debe comparar los caracteres de NumberDecimalSeparator
ya que es una cadena, no un solo carácter, por lo que debe tener en cuenta los escenarios en los que hay más de un carácter en la cadena.
La llamada
CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator
obtiene el separador decimal para la cultura actual de la interfaz de usuario. Puede usar otras culturas para obtener el separador para otros idiomas.
EDITAR
De las 166 culturas que se informan en mi sistema ( CultureInfo.GetCultures(CultureTypes.SpecificCultures).Count()
), parece que solo se usan dos separadores: punto y coma. Puedes probar esto en tu sistema:
var seps = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
.Select(ci => ci.NumberFormat.NumberDecimalSeparator)
.Distinct()
.ToList();
Suponiendo que esto sea cierto, este método puede ser útil (tenga en cuenta que keyCode
está en keyCode
con el indicador de modifiers
para eliminar combinaciones inválidas):
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));
}
Una última nota: según la enumeración de Keys , el valor 46 que mencionas corresponde a la tecla DEL (Eliminar) (es decir, el punto cuando el Bloq Num está desactivado).