String.Format - 它是如何工作的以及如何实现自定义格式字符串

hwc*_*rwe 77 .net c# vb.net string string-formatting

使用String.Format()它可以以DateTime许多不同的方式格式化例如对象.每当我寻找所需的格式时,我都需要在互联网上搜索.我几乎总能找到一个可以使用的例子.例如:

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

但我不知道它是如何工作的以及哪些类支持这些"魔术"附加字符串.

所以我的问题是:

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

yam*_*men 86

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

可选地提供格式字符串:

{ index[,alignment][ : formatString] }

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

一个IFormatProvider也可以使用能够用于捕获基本格式标准/默认值等.实施例在这里在这里.

所以按顺序回答你的问题:

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

  2. 实现的任何对象都IFormattable支持此功能.你甚至可以自己写!

  3. 是的,见上文.

  • +1链接到**文档**."在互联网上搜索"可以.但是当你需要更深入的理解时,你应该阅读手册. (10认同)
  • @hwcverwe [格式化类型](http://msdn.microsoft.com/en-us/library/fbxft59x%28v=vs.90%29.aspx) (3认同)

Dea*_*mas 18

根据我的理解,你需要在你的类中实现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())
Run Code Online (Sandbox Code Playgroud)


Ste*_*eve 5

  1. 查看官方 MSDN 文档,这里有 DateTime 格式字符串的完整列表:http : //msdn.microsoft.com/en-us/library/az4se3k1.aspx。确实有不少“神奇”的字符串。

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

  3. 是的,您可以编写自己的数据,如果您有可以以不同方式格式化的数据,您可能应该通过实现 IFormattable 来编写自定义格式化程序,再次参见此处的文档:http : //msdn.microsoft.com/en-us/图书馆/system.iformattable.aspx。这相当简单,您只需检查提供的字符串并根据这些写出您的数据,幕后没有任何魔法:-)