728x90

문자열에서 숫자만 추출해야 할 경우가 있다.

정규식을 이용하여 문자열에서 숫자만 추출하면 편리하다.

하지만 원하지 않는 결과가 나올 수도 있다는 걸 알았다.

정규표현식 설명 잘된 곳 : 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 = "현재 최신버전을 사용하고 있습니다";
    }
}

블로그 이미지

Link2Me

,