2008-10-15 21 views
5

Estoy tratando de ver si el usuario ha presionado un separador decimal en un cuadro de texto y permite o suprime en función de otros parámetros.Cómo detecto un separador NumberDecimal en un evento KeyDown (C#)

NumberdecimalSeparator devuelve como 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.

¿Acabo de seguir buscando comas/puntos, o hay una manera mejor?

Respuesta

9

La llamada

CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator 

obtiene el separador decimal para la cultura actual interfaz de usuario. Puede usar otras culturas para obtener el separador para otros idiomas.


EDITAR

De los 166 cultivos de los que se informa en mi sistema (CultureInfo.GetCultures(CultureTypes.SpecificCultures).Count()), parece que sólo se utilizan dos separadores: punto y coma. Usted puede intentar esto en su sistema:

var seps = CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
      .Select(ci => ci.NumberFormat.NumberDecimalSeparator) 
      .Distinct() 
      .ToList(); 

Suponiendo que esto es cierto, este método puede ser útil (tenga en cuenta que el keyCode se OR siempre con la bandera modifiers con el fin de eliminar las combinaciones no vá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 Keys enumeration, el valor 46 que usted menciona corresponde a la tecla DEL (Eliminar) (es decir, el punto cuando el Bloq Num está desactivado).

+1

Esto no responde la pregunta al considerar: "NumberdecimalSeparator devuelve como 46 o '.' en mi sistema de EE. UU. Muchos otros países usan ',' como separador. El evento KeyDown establece KeyValue en 190 cuando presiono el punto ". ... como está escrito en la pregunta. –

0

El problema aquí es que los valores en el KeyEventArgs son códigos clave, no caracteres. Si maneja KeyPress en su lugar, obtendrá una char en el KeyPressEventArgs que puede usar para la comparación.

Nota: Realmente debe comparar los caracteres NumberDecimalSeparator ya que es una cadena, ni 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.

Cuestiones relacionadas