2008-10-15 3 views
5

사용자가 텍스트 상자에서 소수 구분 기호를 누른 경우 다른 매개 변수에 따라 허용 또는 억제할지 확인하려고합니다.KeyDown 이벤트 (C#)에서 NumberDecimalSeparator를 검색하는 방법

NumberdecimalSeparator는 46 또는 '.'을 반환합니다. 내 미국 시스템에. 다른 많은 국가에서는 구분 기호로 ','를 사용합니다. KeyDown 이벤트는 마침표를 누르면 KeyValue를 190으로 설정합니다.

쉼표/​​마침표를 계속 검색하나요, 아니면 더 좋은 방법이 있습니까?

답변

9

CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator 

현재 사용자 인터페이스 배양 소수 구분을 얻는다. 다른 문화권을 사용하여 다른 언어의 구분 기호를 사용할 수 있습니다. 기간 및 쉼표 :


내 시스템 (CultureInfo.GetCultures(CultureTypes.SpecificCultures).Count())에보고 된 166 개 문화에서

편집, 두 분리기가 사용되는 것 같다. 당신은 당신의 시스템이 시도 할 수 있습니다 :

을이 사실이라고 가정

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

,이 방법합니다 (keyCode가 무효 조합을 제거하기 위해 modifiers 플래그를 OR로되어 있습니다) 도움이 될 수 있습니다

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

마지막주의 사항 : Keys enumeration에 따르면 값 46은 DEL (삭제) 키 (Num Lock이 OFF 인 지점)에 해당합니다.

+1

고려할 때 질문에 대답하지 않습니다. "NumberdecimalSeparator가 46 또는 '.'을 반환합니다. 다른 국가에서는 구분 기호로 ','를 사용하며 KeyDown 이벤트는 마침표를 누르면 KeyValue가 190으로 설정됩니다. " ... 질문에 쓰여 있습니다. –

0

여기서 문제는 KeyEventArgs의 값이 문자가 아니라 키 코드라는 점입니다. 대신 KeyPress을 처리하면 KeyPressEventArgs에 문자가 표시되어 비교할 수 있습니다.

참고 : NumberDecimalSeparator 문자는 문자가 아닌 문자열이므로 실제로 문자열과 비교해야합니다. 따라서 문자열에 문자가 두 개인 경우를 고려해야합니다.