visual tecla studio presionada form event detectar c# internationalization keyboard-events culture

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).