문자열에서 숫자만 추출해야 할 경우가 있다.
정규식을 이용하여 문자열에서 숫자만 추출하면 편리하다.
하지만 원하지 않는 결과가 나올 수도 있다는 걸 알았다.
정규표현식 설명 잘된 곳 : http://www.nextree.co.kr/p4327/
using System.Text.RegularExpressions;
// 숫자만 추출
_body = Regex.Replace(_body, @"[^0-9]", "");
// 영문자만 추출
_body = Regex.Replace(_body, @"[^a-zA-Z]", "");
// 한글만 추출
_body = Regex.Replace(_body, @"[^가-힣]", "");
문자열 전체가 숫자인지 검사하여 숫자이면 true 를 반환하는 bool 함수
/// <summary>
/// 문자열이 숫자인지 검사하여 숫자이면 true 를 반환
/// </summary>
public bool isNumeric(string str)
{
double Num;
bool isNum = double.TryParse(str, out Num);
if (isNum)
{
return true;
}
else
{
return false;
}
}
예외 처리는 무겁기 때문에 꼭 필요하지 않다면 가급적 발생하지 않도록 코딩해야 한다.
문자열에서 숫자만 추출하는 경우에 에러가 발생하지 않을 것이라고 생각한 것 때문에 버그 잡이 하느라고 몇시간을 허비했다.
System.Math.Truncate(double형 숫자); 를 추가하고 나서야 원인 해결이 되었다.
예제를 하나 만들어서 작성해둔다.
private void btnRegex_Click(object sender, EventArgs e)
{
string msg1 = "2000.34567 을 Math.Truncate 함수를 사용하면 ";
string msg2 = "2000.34567 을 정규식으로 숫자만 추출하면 ";
string msg3 = "숫자로 된 문자열에서 double.Parse 함수를 이용하면 ";
double a = 2000.34567;
double quotient = System.Math.Truncate(a); // 정수형만 구하기
string _body = "2000.34567";
double b = double.Parse(_body);
_body = Regex.Replace(_body, @"[^0-9]", "");
MessageBox.Show(msg1 + quotient.ToString() + Environment.NewLine + msg2 + _body + Environment.NewLine + msg3 + b.ToString());
}
결과는
정규식을 잘못 사용하면 소수점을 무시하고 전혀 엉뚱한 결과를 초래할 수 있다는 것 !!!
숫자로 결과를 만드는 경우에는 철저한 검증을 하지 않으면 오류가 나기 쉽다는 걸 몸소 체험했다.
private void checkForUpdate()
{
// 문자열에서 숫자만 추출해서 버전을 비교하여 서버 버전이 높으면 업데이트 파일 다운로드
if (int.Parse(Regex.Replace(getLVersion(), @"\D", "")) < int.Parse(Regex.Replace(getSVersion(), @"\D", "")))
{
btnDownload.Visible = true;
SetupGuide.Visible = true;
}
else
{
SetupGuide.Visible = true;
SetupGuide.Text = "현재 최신버전을 사용하고 있습니다";
}
}