내보내기(0) 인쇄
모두 확장
이 문서는 수동으로 번역한 것입니다. 원본 텍스트를 보려면 포인터를 문서의 문장 위로 올리십시오.
번역
원본

IFormatProvider 인터페이스

서식 지정을 제어하는 개체를 검색하기 위한 메커니즘을 제공합니다.

네임스페이스:  System
어셈블리:  mscorlib(mscorlib.dll)

[ComVisibleAttribute(true)]
public interface IFormatProvider

IFormatProvider 형식에서는 다음과 같은 멤버를 노출합니다.

  이름설명
Public 메서드Windows Phone용 Silverlight에서 지원Xbox 360에서 지원GetFormat지정된 형식에 대한 형식 지정 서비스를 제공하는 개체를 반환합니다.
위쪽

IFormatProvider 인터페이스는 형식 지정 및 구문 분석 작업에 대해 형식 지정 정보를 제공하는 개체를 지원합니다. 서식 지정 작업에서는 형식의 값을 해당 값의 문자열 표현으로 변환합니다. 일반적인 서식 지정 메서드는 형식의 ToString 메서드와 Format입니다. 구문 분석 작업에서는 값의 문자열 표현을 해당 값의 형식으로 변환합니다. 일반적인 구문 분석 메서드는 ParseTryParse입니다.

IFormatProvider 인터페이스는 단일 메서드, IFormatProvider.GetFormat로 구성되어 있습니다. GetFormat 은 콜백 메서드입니다. 이 구문 분석 또는 서식 메서드는 서식을 호출하고 서식 또는 구문 분석 메서드가 예상하는 개체 형식이 서식 정보를 제공하는 Type 개체에 전달합니다. GetFormat 메서드는 해당 형식의 개체를 반환합니다.

IFormatProvider 구현은 형식 지정 및 구문 분석 메서드에서 암시적으로 사용되는 경우가 많습니다. 예를 들어, DateTime.ToString(String) 메서드는 암시적으로 시스템의 현재 문화권을 나타내는 IFormatProvider 구현을 사용합니다. 또한 IFormatProvider 구현은 Int32.Parse(String, IFormatProvider) and String.Format(IFormatProvider, String, Object[])와 같은 IFormatProvider 형식의 매개 변수가 있는 메서드로 명시적으로 지정할 수 있습니다.

.NET Framework에는 숫자 값과 날짜 및 시간 값의 형식을 지정하거나 구문 분석할 때 사용되는 문화별 정보를 제공하기 위해 다음 세 가지의 미리 정의된 IFormatProvider 구현이 포함되어 있습니다.

  • NumberFormatInfo 클래스는 특정 문화권에서 숫자의 형식을 지정하는 데 사용되는 통화, 1000 단위 구분 기호 및 소수 구분 기호 등의 정보를 제공합니다.

  • DateTimeFormatInfo 클래스는 특정 문화권의 날짜 및 시간 구분 기호, 날짜의 년, 월, 일 구성 요소 순서와 형태 등 날짜 및 시간 형식을 지정하는 데 사용되는 정보를 제공합니다.

  • CultureInfo 클래스는 특정 문화권을 나타냅니다. 해당 GetFormat 메서드는 CultureInfo 개체가 숫자 또는 날짜 및 시간과 관련된 형식 지정 또는 구문 분석 작업에서 사용되는지에 따라 문화권별 NumberFormatInfo 또는 DateTimeFormatInfo 개체를 반환합니다.

.NET Framework에서는 사용자 지정 서식 지정도 지원합니다. 일반적으로 이 과정에서 IFormatProviderICustomFormatter를 모두 구현하는 형식 지정 클래스를 만들어야 합니다. 그런 후에 이 클래스 인스턴스는 String.Format(IFormatProvider, String, Object[])과 같이 사용자 지정 형식 지정 작업을 수행하는 메서드에 매개 변수로 전달됩니다. 이 예제에서는 숫자 형식을 12자리 계정 번호로 지정하는 사용자 지정 구현에 대해 설명합니다.

다음 예제에서는 IFormatProvider 구현에서 날짜 및 시간 값의 표현을 변경하는 방법을 보여 줍니다. 이 경우 하나의 날짜가 서로 다른 네 문화권을 나타내는 CultureInfo 개체를 사용하여 표시됩니다.


using System;
using System.Globalization;

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      DateTime dateValue = new DateTime(2009, 6, 1, 16, 37, 0);
      CultureInfo[] cultures = { new CultureInfo("en-US"), 
                                 new CultureInfo("fr-FR"),
                                 new CultureInfo("it-IT"),
                                 new CultureInfo("de-DE") };
      foreach (CultureInfo culture in cultures)
         outputBlock.Text += String.Format("{0}: {1}", culture.Name, dateValue.ToString(culture)) + "\n";
   }
}
// The example displays the following output:
//       en-US: 6/1/2009 4:37:00 PM
//       fr-FR: 01/06/2009 16:37:00
//       it-IT: 01/06/2009 16.37.00
//       de-DE: 01.06.2009 16:37:00


다음 예제에서는 IFormatProvider 인터페이스 및 GetFormat 메서드를 구현하는 클래스의 사용 방법을 보여 줍니다. AcctNumberFormat 클래스는 계정 번호를 나타내는 Int64 값을 형식이 지정된 12자리 계정 번호로 변환합니다. 이 클래스의 GetFormat 메서드는 formatType 매개 변수가 ICustomFormatter를 구현하는 클래스를 참조하는 경우 현재 AcctNumberFormat 인스턴스에 대한 참조를 반환하고, 그렇지 않은 경우 GetFormatnull을 반환합니다.


public class AcctNumberFormat : IFormatProvider, ICustomFormatter
{
   private const int ACCT_LENGTH = 12;

   public object GetFormat(Type formatType)
   {
      if (formatType == typeof(ICustomFormatter))
         return this;
      else
         return null;
   }

   public string Format(string fmt, object arg, IFormatProvider formatProvider) 
   {
      // Provide default formatting if arg is not an Int64.
      if (arg.GetType() != typeof(Int64))
         try {
            return HandleOtherFormats(fmt, arg); 
         }
         catch (FormatException e) {
            throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e);
         }

      // Provide default formatting for unsupported format strings.
      fmt = fmt.ToUpper(CultureInfo.InvariantCulture);
      if (! (fmt == "H" || fmt == "I")) 
         return HandleOtherFormats(fmt, arg);

      // Convert argument to a string.
      string result = arg.ToString();

      // If account number is less than 12 characters, pad with leading zeroes.
      if (result.Length < ACCT_LENGTH)
         result = result.PadLeft(ACCT_LENGTH, '0');
      // If account number is more than 12 characters, truncate to 12 characters.
      if (result.Length > ACCT_LENGTH)
         result = result.Substring(0, ACCT_LENGTH);   

      if (fmt.ToUpper() == "I")                    // Integer-only format. 
         return result;
      // Add hyphens for H format specifier.
      else if (fmt.ToUpper() == "H")               // Hyphenated format.
         return result.Substring(0, 5) + "-" + result.Substring(5, 3) + "-" + result.Substring(8);
      // Return string representation of argument for any other formatting code.
      else
         try {
            return HandleOtherFormats(fmt, arg); 
         }
         catch (FormatException e) {
            throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e);
         }
   }

   private string HandleOtherFormats(string format, object arg)
   {
      if (arg is IFormattable) 
         return ((IFormattable)arg).ToString(format, CultureInfo.CurrentCulture);
      else if (arg != null)
         return arg.ToString();
      else
         return String.Empty;
   }
}


그런 다음 IFormatProvider를 구현하는 클래스를 사용하여 형식 지정 및 구문 분석 작업을 호출할 수 있습니다. 예를 들어 다음 코드에서는 String.Format(IFormatProvider, String, Object[]) 메서드를 호출하여 형식이 지정된 12자리 계정 번호가 들어 있는 문자열을 생성합니다.


public enum DaysOfWeek { Monday=1, Tuesday=2 };

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      long acctNumber;
      double balance; 
      DaysOfWeek wday; 
      string output;

      acctNumber = 104254567890;
      balance = 16.34;
      wday = DaysOfWeek.Monday;

      output = String.Format(new AcctNumberFormat(), 
                             "On {2}, the balance of account {0:H} was {1:C2}.", 
                             acctNumber, balance, wday);
      outputBlock.Text += output + "\n";

      wday = DaysOfWeek.Tuesday;
      output = String.Format(new AcctNumberFormat(), 
                             "On {2}, the balance of account {0:I} was {1:C2}.", 
                             acctNumber, balance, wday);
      outputBlock.Text += output + "\n";
   }
}
// The example displays the following output:
//    On Monday, the balance of account 10425-456-7890 was $16.34.
//    On Tuesday, the balance of account 104254567890 was $16.34.


Silverlight

5, 4, 3에서 지원

Windows Phone용 Silverlight

Windows Phone OS 7.1, Windows Phone OS 7.0에서 지원

XNA Framework

Xbox 360, Windows Phone OS 7.0에서 지원

Silverlight에서 지원되는 운영 체제 및 브라우저에 대한 자세한 내용은 지원되는 운영 체제 및 브라우저을 참조하십시오.

커뮤니티 추가 항목

추가
표시:
© 2015 Microsoft