소프트웨어 개발(SW Dev)/C#

사용자 지정 서식 공급자 구현

flowhistory 2023. 3. 15. 17:24

string.Format()을 사용자 정의에 따라 추가 형식으로 확장할 수 있는 클래스 구현 예시

 

 

1. 사용자 지정서식 클래스 UriEncodeFormatter  구현

using System;
using System.Globalization;

namespace CustomFormat
{
    /// 클래스 요약 정보
    /// 문자열 서식 지정을 위한 추가 기능을 제공하는 사용자 지정 서식 공급자 구현
    /// "{arg#:st}"를 사용하여 형식이 지정된 값의 URI 인코딩을 제공함
    sealed class UriEncodeFormatter : IFormatProvider, ICustomFormatter
    {
        public static readonly UriEncodeFormatter Default = new UriEncodeFormatter();
        public object GetFormat(Type formatType)
        {
            // if 상용구이면
            if (typeof(ICustomFormatter) == formatType)
                return this;
            else
                return null;
        }

        public string Format(string format, object arg, IFormatProvider formatProvider)
        {
            // if "st"가 지정되지 않은 경우
            if ("st" != format)
                return _FormatOther(format, arg);

            // "st"가 지정되고 arg가 비어 있지 않은 문자열이면 url 인코딩 
            var s = Convert.ChangeType(arg ,typeof(string)) as string;
            if (null == s)
                s = "";
            return Uri.EscapeDataString(s);
        }

        string _FormatOther(string format, object arg)
        {
            // 기본 formattable 
            var fmt = arg as IFormattable;

            if (null != fmt)
                return fmt.ToString(format, CultureInfo.CurrentCulture);
            else if (null!=arg)
                return arg.ToString();
            else
                return string.Empty;
        }
    }
}

 

2. 구현된 UriEncodeFormatter  사용 예시

// Program.cs 

static void Main(string[] args)
{
		// 사용자 정의 urlencodeformatter 예1
		Console.WriteLine(string.Format(UriEncodeFormatter.Default, "{0:st}", "aaa dddd@"));

		// 사용자 정의 urlencodeformatter 예2
		Console.WriteLine(string.Format(UriEncodeFormatter.Default, "{0:st}", "string !!!"));

		// 출력 결과를 보기 위한 대기
		Console.Read();
}

 

출력 결과

 

728x90