2008-10-15 22 views
5

Próbuję sprawdzić, czy użytkownik wcisnął separator dziesiętny w polu tekstowym, a następnie zezwolić lub wyłączyć go w zależności od innych parametrów.Jak wykryć NumberDecimalSeparator w zdarzenie KeyDown (C#)

NumerdecimalSeparator zwraca jako 46 lub "." w moim systemie amerykańskim. Wiele innych krajów używa "," jako separatora. Zdarzenie KeyDown ustawia KeyValue na 190, kiedy naciskam kropkę.

Czy po prostu dalej szukam przecinków/kropek, czy jest lepszy sposób?

Odpowiedz

9

Wezwanie

CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator 

dostaje separator dziesiętny dla bieżącej kultury interfejsu użytkownika. Możesz użyć innych kultur, aby uzyskać separator dla innych języków.


EDIT

Od 166 kultur, które zostały zgłoszone w moim systemie (CultureInfo.GetCultures(CultureTypes.SpecificCultures).Count()), wydaje się, że wykorzystywane są tylko dwa separatory: okres i przecinek. Można spróbować tego w systemie:

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

Zakładając, że to prawda, ta metoda może być pomocna (zauważ, że keyCode jest ALTERNATYWA z flagą modifiers w celu wyeliminowania nieprawidłowych kombinacji):

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

Ostatnia uwaga: Według Keys enumeration, wartość 46, o której wspomniałeś, odpowiada klawiszowi DEL (Delete) (tj. Punktowi, w którym Num Lock jest WYŁĄCZONY).

+1

Nie odpowiada na pytanie: "Funkcja NumberdecimalSeparator zwraca wartość 46 lub". " w moim systemie w USA Wiele innych krajów używa "," jako separatora Zdarzenie KeyDown ustawia KeyValue na 190, kiedy naciskam kropkę. " ... jak napisano w pytaniu. –

0

Problem polega na tym, że wartości w KeyEventArgs są kodami kluczowymi, a nie znakami. Jeśli zamiast tego obsłużysz KeyPress, otrzymasz znak w KeyPressEventArgs, którego możesz użyć do porównania.

Uwaga: Powinieneś naprawdę porównać znaki NumberDecimalSeparator, ponieważ jest to ciąg znaków, a nie pojedynczy znak, więc powinieneś rozważyć scenariusze, w których występuje więcej niż jeden znak w ciągu.