MSDN Library
信息
您所需的主题如下所示。但此主题未包含在此库中。

IFormatProvider.GetFormat 方法

2013/12/13

返回一个对象,该对象为指定类型提供格式设置服务。

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 实现然后会作为参数传递到参数类型为 IFormatProvider(例如 String.Format(IFormatProvider, String, Object[])Int32.ToString(String, IFormatProvider)DateTime.Parse(String, IFormatProvider))的分析或格式设置方法的任何重载。

下面的示例演示如何使用一个类来实现 IFormatProvider 接口和 GetFormat 方法。AcctNumberFormat 类将表示帐号的 Int64 值转换为格式化的 12 位帐号。如果 formatType 参数引用的类实现 ICustomFormatter,其 GetFormat 方法返回对自身的引用;否则,GetFormat 返回 null


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

Windows Phone

显示:
© 2016 Microsoft