[C#] TextBox 의 숫자 자릿수 통제
2010. 12. 15. 17:54ㆍCoders
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 |