情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

IFormatProvider インターフェイス

2013/12/12

書式を制御するオブジェクトを取得するための機構を提供します。

Namespace:  System
アセンブリ:  mscorlib (mscorlib.dll 内)

public interface IFormatProvider

IFormatProvider 型で公開されるメンバーは以下のとおりです。

  名前説明
パブリック メソッドGetFormat指定した型の書式指定サービスを提供するオブジェクトを返します。
このページのトップへ

IFormatProvider インターフェイスによって、書式設定および解析の操作の書式情報を提供するオブジェクトが提供されます。書式設定操作では、特定の型の値を、その値の文字列形式に変換します。一般的な書式設定メソッドには、型の ToString メソッドおよび Format があります。解析操作では、特定の値の文字列形式を、その値を持つ型に変換します。一般的な解析メソッドには、Parse および TryParse があります。

IFormatProvider インターフェイスは、単一のメソッド IFormatProvider.GetFormat で構成されます。GetFormat はコールバック メソッドです。解析メソッドまたは書式設定メソッドでは、このコールバック メソッドを呼び出し、書式設定メソッドまたは解析メソッドで書式情報の提供元となることが想定されているオブジェクトの型を表す Type オブジェクトをそのコールバック メソッドに渡します。その型のオブジェクトを返すのは、GetFormat メソッドです。

IFormatProvider 実装は、多くの場合、書式設定メソッドおよび解析メソッドによって暗黙的に使用されます。たとえば、DateTime.ToString(String) メソッドでは、システムの現在のカルチャを表す IFormatProvider 実装を暗黙的に使用します。また、IFormatProvider 実装を Int32.Parse(String, IFormatProvider)String.Format(IFormatProvider, String, Object[]) などの IFormatProvider 型のパラメーターを持つメソッドで明示的に指定することもできます。

.NET Framework には、数値および日付と時刻の値の書式設定または解析で使用されるカルチャ固有の情報を提供するために、次の 3 つの定義済みの IFormatProvider 実装が含まれています。

  • 特定のカルチャに対応する、通貨、桁区切り記号、小数点の記号など、数字の書式設定で使用される情報が用意されている NumberFormatInfo クラス。

  • 特定のカルチャに対応する日付と時刻の区切り記号や、日付の年月日の各要素の順番および形式など、日付と時刻の書式設定で使用される情報が用意されている DateTimeFormatInfo クラス。

  • 特定のカルチャを表す CultureInfo クラス。その GetFormat メソッドは、CultureInfo オブジェクトが数字または日付と時刻に関連する書式設定または解析の操作で使用されるかどうかに応じて、カルチャ固有の NumberFormatInfo オブジェクトまたは DateTimeFormatInfo オブジェクトを返します。

.NET Framework では、カスタムの書式設定もサポートされています。通常、そのためには、IFormatProvider および ICustomFormatter の両方を実装する書式設定クラスを作成する必要があります。次に、このクラスのインスタンスをパラメーターとして、String.Format(IFormatProvider, String, Object[]) などのカスタムの書式設定操作を実行するメソッドに渡します。数字を 12 桁のアカウント番号として書式設定するカスタムの実装の具体的な例を次に示します。

IFormatProvider 実装で日付と時刻の値の形式を変更する方法を次の例に示します。ここでは、1 つの日付を、4 つの異なるカルチャを表す 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.


Windows Phone OS

サポート: 8.0, 7.1, 7.0

表示: