String.Format – 它是如何工作的以及如何实现自定义格式string

通过String.Format() ,可以用许多不同的方式来格式化DateTime对象。 每当我寻找所需的格式,我需要在互联网上search。 几乎总是我find一个我可以使用的例子。 例如:

 String.Format("{0:MM/dd/yyyy}", DateTime.Now); // "09/05/2012" 

但我不知道它是如何工作的,哪些类支持这些“魔术”附加string。

所以我的问题是:

  1. String.Format如何将附加信息MM/dd/yyyy映射到string结果?
  2. 所有的Microsoft对象都支持这个function吗?
    这是logging在某处吗?
  3. 是否有可能做这样的事情:
    String.Format("{0:MyCustomFormat}", new MyOwnClass())

String.Format将string( {0}等)中的每个标记与相应的对象进行匹配: http : //msdn.microsoft.com/en-us/library/system.string.format.aspx

格式string是可选的:

{ index[,alignment][ : formatString] }

如果提供了formatString ,则相应的对象必须实现IFormattable ,特别是接受formatStringToString方法,并返回相应的格式化string: http : //msdn.microsoft.com/en-us/library/system.iformattable.tostring.aspx

一个IFormatProvider也可以用来捕获基本的格式标准/默认值等。 这里和这里的例子。

所以你的问题的答案依次为:

  1. 它在DateTime对象上使用IFormattable接口的ToString()方法,并传递MM/dd/yyyy格式的string。 这是返回正确的string的实现。

  2. 任何实现IFormattable对象IFormattable支持这个特性。 你甚至可以自己写!

  3. 是的,看上面。

从我的理解,你需要在你的class级实施IFormattable来支持这一点。 然后有方法,ToString将你传入的参数传入String.Format。

这是一个例子。

 // Define other methods and classes here public class Sample : IFormattable { public string ToString(string format, IFormatProvider provider) { return String.Concat("Your custom format was ", format); } } String.Format("{0:MyCustomFormat}", new Sample()) 
  1. 检查官方的MSDN文档,这里有一个DateTime格式string的完整列表: http : //msdn.microsoft.com/en-us/library/az4se3k1.aspx 。 确实有不less“神奇”的string。

  2. 据我所知,并非所有types都有“有趣”的格式,但所有types都支持ToString() 。 如果你需要格式化一个内置的对象,你可以添加一个扩展方法来做到这一点,但是通常格式化是在需要的地方提供的(或者换句话说,我只为自己的types写了自定义的格式化程序) 。

  3. 是的,你可以写自己的,如果你有不同的格式的数据,你可能应该通过实施IFormattable编写自定义的格式化程序,再次在这里看到的文档: http : //msdn.microsoft.com/en-us/ library / system.iformattable.aspx 。 这很简单,你只需检查提供的string,并根据这些数据写出你的数据,幕后就没有魔法了:-)

在下面覆盖String.Format做一些如下,

 IFormattable formattable = objectToFormat as IFormattable; if (formattable != null) { formattable.ToString(objectToFormat); } else { objectToFormat.ToString(); } 

对于你的问题,

  1. String.Format如何将附加信息MM / dd / yyyy映射到string结果?

    如上所述,它只是调用IFormattable .ToString(string格式,IFormatProvider提供程序)。 提供者往往是告诉你什么文化是你的系统。 通常为null,因为人们不会像你在你的情况那样通过String.Format()。

  2. 所有的微软对象都支持这个function吗? 这是logging在某处吗?

    任何实现IFormattable的东西都可以。

  3. 是否有可能做这样的事情: String.Format("{0:MyCustomFormat}, new MyOwnClass())

    本质上,如果你想让自己的对象使用提供的格式来执行IFormattable

有大量的支持类和枚举器来确保这个格式string在很大程度上是相似的。 更多在这里 。

是的,这是可能的 – 它可以完全定制。 查看date和时间自定义格式的文档链接。

如果你有自己的对象,你可以重写ToString()方法并输出任何你认为合适的表示。 一旦你这样做,你可以使用String.Format("{0:MyCustomFormat}", new MyOwnClass())因为这隐式调用MyOwnClass.ToString()

date的文档可以在这里find: http : //msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

这应该告诉你所有的date格式字符像MM的意思。

如果要更改自定义类的string输出方式,可以重写ToString方法,如下所示:

 public class User { public string Name { get; set; } public int Age { get; set; } public override string ToString() { return this.Name + " is " + this.Age + " years old."; } } 

然后你可以做一些像myUser.ToString()一样的东西,并得到你指定的输出。

并回答你的第三个问题:这是不可能的这种语法,但你可以提供IFormatProviderICustomFormatter实例为您没有创build一个types,或实现IFormattable在你的types(虽然,基本上扩展ToString )。