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