英語で読む

次の方法で共有


IFormatProvider.GetFormat(Type) メソッド

定義

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

C#
public object GetFormat(Type formatType);
C#
public object? GetFormat(Type? formatType);

パラメーター

formatType
Type

返す書式オブジェクトの型を指定するオブジェクト。

戻り値

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

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

C#
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.
      string ufmt = fmt.ToUpper(CultureInfo.InvariantCulture);
      if (!(ufmt == "H" || ufmt == "I"))
         try {
            return HandleOtherFormats(fmt, arg);
         }
         catch (FormatException e) {
            throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e);
         }

      // 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 (ufmt == "I")                    // Integer-only format.
         return result;
      // Add hyphens for H format specifier.
      else                                         // Hyphenated format.
         return result.Substring(0, 5) + "-" + result.Substring(5, 3) + "-" + result.Substring(8);
   }

   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 桁のアカウント番号を生成します。

C#
using System;
using System.Globalization;

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

public class TestFormatting
{
   public static void Main()
   {
      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);
      Console.WriteLine(output);

      wday = DaysOfWeek.Tuesday;
      output = String.Format(new AcctNumberFormat(),
                             "On {2}, the balance of account {0:I} was {1:C2}.",
                             acctNumber, balance, wday);
      Console.WriteLine(output);
   }
}
// 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.

注釈

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

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

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

適用対象

製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0