[C#] TextBox 의 숫자 자릿수 통제

2010. 12. 15. 17:54Coders

C# 코딩을 하다보니, editor(TextBox)를 직접 컨트롤 하여 숫자 자릿수 통제를 해야 하는 일이 생겼습니다. 자그마한 회사는 아니어서, 여기저기 끌어다 쓸 수 있는 라이브러리가 없을까 찾아보던 중, 그까이거 뭐 좀 짱구를 굴리면 할 수 있겠지, 하는 마음에 작성해 보았습니다.

※ 참고로, 다음 소스코드는 CopyNpaste 에 대한 처리는 해 놓지 않았습니다.

int nPreLen = 5; int nPostLen = 2; TextBox myEditor = new TextBox(); myEditor.KeyPress += new KeyPressEventHandler(myEditor_KeyPress); private void myEditor_KeyPress(object sender, KeyPressEventArgs e) { //백스페이스는 그냥 허용 if (e.KeyChar == '\b') return; //sender 로부터 텍스트 박스 구함 TextBox editor = sender as TextBox; //소숫점의 점(dot)이 포함되어 있는지 여부. //단, 현재 selection 상태인 텍스트에 점이 포함되어 있으면 비포함으로 간주 bool bDotContains = editor.Text.Contains(".") && !editor.SelectedText.Contains("."); //전체 길이 체크를 위한 변수(selection 길이는 뺀다) int nTextLen = editor.Text.Length - editor.SelectedText.Length; //현재 커서 위치 int nCursor = editor.SelectionStart; //점과 숫자 이외의 값은 받아들이지 않음. if (e.KeyChar != '.' && !char.IsDigit(e.KeyChar)) e.Handled = true; //소숫점 이하 값이 없는 경우 - 2010.12.29 추가 else if (e.KeyChar == '.' && nPostLen < 1) e.Handled = true; //점이 포함되어 있을 경우 else if (bDotContains) { //전체 길이 체크 정수부와 소수부의 길이 더하기 점의 길이보다 같거나 크면 받아들이지 않음. //또한, 이미 점이 포함되어 있으므로, 점이 들어오면 받아들이지 않음. if (nTextLen >= nPreLen + nPostLen + 1 || e.KeyChar == '.') e.Handled = true; else { //점의 위치를 구한다. int nDotPos = editor.Text.IndexOf('.'); //텍스트를 정수부와 소수부로 나눈다. string[] sSep = editor.Text.Split('.'); //현재 커서가 점 앞에 있고, 정수부의 길이가 지정된 길이보다 길어지면 받아들이지 않음. if (nDotPos > nCursor && sSep[0].Length >= nPreLen) e.Handled = true; //현재 커서가 점 뒤에 있고, 소수부의 길이가 지정된 길이보다 길어지면 받아들이지 않음. else if (nDotPos < nCursor && sSep[1].Length >= nPostLen) e.Handled = true; } } //들어온 값이 점이 아니고, 현재 텍스트가 점을 포함하지 않으면 //현재 값은 정수인데, 정수부의 길이가 지정된 길이보다 길어지면 받아들이지 않음. else if (e.KeyChar != '.' && !bDotContains && nTextLen >= nPreLen) e.Handled = true; }

※ 소스에 대한 Syntax Highlighting 변환은, 기존의 방식(예전 글을 볼까요?)으로 하려 했으나, 그 사이트가 막힌 건지... 좀 찾아보니 괜찮은 사이트가 있더군요. 앞으로는 이걸로...

'Coders' 카테고리의 다른 글

[C#] 특정 문자열을 막는 코드  (0) 2011.03.17
[Android] 텍스트 공유(Share)  (6) 2010.12.02
XP, Vista 멀티 부팅 설치시 Vista만 삭제하기  (0) 2010.02.03