IFormatProvider.GetFormat メソッド

2013/12/12

指定した型の書式指定サービスを提供するオブジェクトを返します。

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

Object GetFormat(
	Type formatType
)

パラメーター

formatType
型: System.Type
返す書式オブジェクトの型を指定するオブジェクト。

戻り値

型: System.Object
IFormatProvider の実装が formatType で指定した型のオブジェクトを提供できる場合は、そのオブジェクトのインスタンス。それ以外の場合は null

GetFormat は、書式設定メソッドおよび解析メソッドが解析操作で入力文字列の書式に関する情報を取得したり、書式設定の操作で出力文字列の書式に関する情報を取得したりするために呼び出すコールバック メソッドです。書式設定メソッドまたは解析メソッドは、formatType パラメーターを介して、操作を実行するのに必要なオブジェクトの型を渡します。IFormatProvider の実装でこの書式設定オブジェクトまたは解析オブジェクトを提供できる場合は、そのオブジェクトが返されます。そうでない場合は、null が返されます。

たとえば、Int32.ToString(IFormatProvider) メソッドの呼び出しで、メソッドの引数は、現在の整数インスタンスの文字列表現を書式設定する方法に関する情報を提供する IFormatProvider オブジェクトです。ランタイムがこのメソッドを実行すると、IFormatProvider オブジェクトの GetFormat メソッドが呼び出され、NumberFormatInfo 型を表す Type オブジェクトが渡されます。IFormatProvider オブジェクトで NumberFormatInfo オブジェクトを提供できる場合は、そのオブジェクトが返されます。その型のオブジェクトを提供できない場合は、null が返されます。

カスタムの書式設定サービスまたは解析サービスを提供するクラスに、IFormatProvider インターフェイスおよび GetFormat メソッドを実装できます。その場合、IFormatProvider の実装は、String.Format(IFormatProvider, String, Object[])Int32.ToString(String, IFormatProvider)DateTime.Parse(String, IFormatProvider) などの IFormatProvider 型のパラメーターを持つ解析メソッドまたは書式設定メソッドの任意のオーバーロードへの引数として渡されます。

IFormatProvider インターフェイスと GetFormat メソッドを実装したクラスの使用方法を次の例に示します。AcctNumberFormat クラスは、アカウント番号を表す Int64 の値を、書式設定された 12 桁のアカウント番号に変換します。null メソッドは、formatType パラメーターが ICustomFormatter を実装したクラスを参照している場合は、自分自身への参照を返します。それ以外の場合、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;
   }
}


その後、AcctNumberFormat クラスのインスタンスを、書式設定サービスまたは解析サービスを提供するメソッドへの引数として渡すことができます。たとえば、次のコード例では、AcctNumberFormat クラスを 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

表示:
© 2014 Microsoft