2011. 12. 26. 12:01

비주얼 베이직(Visual Basic, VB)에서 편하게 썼던 문자열 처리 함수가 Mid를 비롯한 Left와 Right입니다.

 

Mid : 문자열에서 지정된 인덱스에서부터 지정된 개수만큼 문자열 반환

Left : 왼쪽서부터 지정된 개수만큼 문자열 반환

Right : 오른쪽에서부터 지정된 개수만큼 무자열 반환

 

C#에는 'Mid'역할을 하는 'Substring'가 있는데 이것을 이용하여 'Left'와 'Right'를 구현할 수 있습니다.

물론 예외처리를 위해 'Mid'도 구현하면 좋죠 ㅎㅎㅎ

 

그 방법 외에도 'VB'를 참조하여 직접 'Mid', 'Left', 'Right'를 가져와 사용할 수도 있습니다.

참고로 'Mid'의 시작 위치는 1부터 시작합니다.(0부터 시작하면 에러가 남)

그러니 인덱스 방식으로 사용하려면 'Mid'함수는 조금 수정이 필요합니다.

 

 

1. 비주얼 베이직 참조하기

'Microsoft.VisualBasic'를 참조 추가한 후

'using Microsoft.VisualBasic;'을 해줍니다.

 

그 이후 'Strings'의 메소드로 'Mid', 'Left', 'Right'를 사용할 수 있습니다.

 

사용은 아래와 같이 하면 됩니다.

string sTemp = "웹에서 샘플보여줄뗀 실버라이트가 짱이쥐!";
string[] sRetrun = new string[3];
sRetrun[0] = Strings.Mid(sTemp, 3, 5 );
sRetrun[1] = Strings.Left(sTemp, 7);
sRetrun[2] = Strings.Right(sTemp, 6);

 

VB 참조 방식은 배포 시 VB용 DLL이 딸려간다는 단점이 있죠.

(이 DLL이 좀 무겁습니다-_-;;)

그리고 속도 느리기 때문에 문자열만 사용하려고 VB 참조하는 건 그다지 좋은 생각이 아닙니다.

 

 

2. 함수 만들기

'string.Substring' 를 이용하여 'Mid', 'Left', 'Right'를 구현 할 수 있습니다.

//Mid
    /// <summary>
    /// 문자열 원본의 지정한 위치에서 부터 추출할 갯수 만큼 문자열을 가져옵니다.
    /// </summary>
    /// <param name="sString">문자열 원본</param>
    /// <param name="nStart">추출을 시작할 위치</param>
    /// <param name="nLength">추출할 갯수</param>
    /// <returns>추출된 문자열</returns>
    public string Mid(string sString, int nStart, int nLength)
    {
        string sReturn;
            
        //VB에서 문자열의 시작은 0이 아니므로 같은 처리를 하려면 
        //스타트 위치를 인덱스로 바꿔야 하므로 -1을 하여
        //1부터 시작하면 0부터 시작하도록 변경하여 준다.
        --nStart;

        //시작위치가 데이터의 범위를 안넘겼는지?
        if (nStart <= sString.Length)
        {
            //안넘겼다.

            //필요한 부분이 데이터를 넘겼는지?
            if ((nStart + nLength) <= sString.Length)
            {
                //안넘겼다.
                sReturn = sString.Substring(nStart, nLength);
            }
            else
            {
                //넘겼다.
                    
                //데이터 끝까지 출력
                sReturn = sString.Substring(nStart);
            }

        }
        else
        {
            //넘겼다.

            //그렇다는 것은 데이터가 없음을 의미한다.
            sReturn = string.Empty;
        }

        return sReturn;
    }

 

//Left
    /// <summary>
    /// 문자열 원본에서 왼쪽에서 부터 추출한 갯수만큼 문자열을 가져옵니다.
    /// </summary>
    /// <param name="sString">문자열 원본</param>
    /// <param name="nLength">추출할 갯수</param>
    /// <returns>추출된 문자열</returns>
    public string Left(string sString, int nLength)
    {
        string sReturn;
            
        //추출할 갯수가 문자열 길이보다 긴지?
        if ( nLength > sString.Length )
        {
            //길다!

            //길다면 원본의 길이만큼 리턴해 준다.
            nLength = sString.Length;
        }

        //문자열 추출
        sReturn = sString.Substring(0, nLength);

        return sReturn;
    }

 

//Right
    /// <summary>
    /// 문자열 원본에서 오른쪽에서 부터 추출한 갯수만큼 문자열을 가져옵니다.
    /// </summary>
    /// <param name="sString">문자열 원본</param>
    /// <param name="nLength">추출할 갯수</param>
    /// <returns>추출된 문자열</returns>
    public string Right(string sString, int nLength)
    {
        string sReturn;

        //추출할 갯수가 문자열 길이보다 긴지?
        if (nLength > sString.Length)
        {
            //길다!

            //길다면 원본의 길이만큼 리턴해 준다.
            nLength = sString.Length;
        }

        //문자열 추출
        sReturn = sString.Substring(sString.Length - nLength,nLength);

        return sReturn;
    }

 

 

3. 샘플 테스트 및 소스 코드

테스트는 아래서 해주시면 되겠습니다.

 

StringCut.zip
다운로드

 

 

마무리

뭐...결국은 'substring'으로 대동단결입니다 ㅎㅎㅎ