2008-10-15 7 views
5

J'essaie de voir si l'utilisateur a appuyé sur un séparateur décimal dans une zone de texte et l'autoriser ou le supprimer en fonction d'autres paramètres.Comment détecter un NumberDecimalSeparator dans un événement KeyDown (C#)

Le paramètre NumberdecimalSeparator renvoie 46, ou "." sur mon système américain. Beaucoup d'autres pays utilisent ',' comme séparateur. L'événement KeyDown définit KeyValue sur 190 lorsque j'appuie sur la période. Est-ce que je continue simplement à chercher des virgules/périodes, ou y a-t-il un meilleur moyen?

Répondre

9

L'appel

CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator 

obtient le séparateur décimal pour la culture d'interface utilisateur actuelle. Vous pouvez utiliser d'autres cultures pour obtenir le séparateur pour d'autres langues.


EDIT

A partir de 166 cultures qui sont rapportées dans mon système (CultureInfo.GetCultures(CultureTypes.SpecificCultures).Count()), il semble que seuls deux séparateurs sont utilisés: point et la virgule. Vous pouvez essayer cela dans votre système:

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

En supposant que cela est vrai, cette méthode peut être utile (noter que le keyCode est avec le drapeau OU logique modifiers afin d'éliminer les combinaisons non valides):

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)); 
    } 

Une dernière note: Selon Keys enumeration, la valeur 46 que vous mentionnez correspond à la touche DEL (Delete) (c'est-à-dire le point où le verrouillage numérique est désactivé).

+1

Cela ne répond pas à la question lors de l'examen: "Le NumberdecimalSeparator renvoie 46, ou". " sur mon système américain Beaucoup d'autres pays utilisent ',' comme séparateur L'événement KeyDown met le KeyValue à 190 quand j'appuie sur le point. " ... comme indiqué dans la question. –

0

Le problème ici est que les valeurs dans le KeyEventArgs sont des codes clés, pas des caractères. Si vous gérez KeyPress à la place, vous obtiendrez un caractère dans le KeyPressEventArgs que vous pouvez utiliser pour la comparaison.

Remarque: Vous devez vraiment comparer les caractères NumberDecimalSeparator car il s'agit d'une chaîne, pas d'un seul caractère. Vous devez donc prendre en compte les scénarios dans lesquels plusieurs caractères sont présents dans la chaîne.

Questions connexes