private void Tb_InputBoxNum(object sender, KeyPressEventArgs e)
{
// Dot 이전의 값 (정수)
int nPreLen = 3;
// Dot 이후의 값 (실수)
int nPostLen = 4;
//백스페이스는 그냥 허용
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.KeyChar != '-')
e.Handled = true;
//소숫점 이하 값이 없는 경우 - 2010.12.29 추가
else if (e.KeyChar == '.' && nPostLen < 1)
e.Handled = true;
else if (e.KeyChar == '-' && nCursor != 0) // 음수 부호는 맨 앞자리에만 가능
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;
}
'[C#]' 카테고리의 다른 글
[C#] 파일은 인터넷 또는 제한 영역에 있거나 파일에 웹 표시 (0) | 2023.04.24 |
---|---|
[C#] Color Dialog 생성 위치 지정하기 (0) | 2023.04.21 |
Visual Studio Change C# language Version (1) | 2023.04.04 |
C# 메서드, 코드 블럭 메모리 사용량 체크 (0) | 2023.03.13 |