String.Format – 它是如何工作的以及如何实现自定义格式string
通过String.Format()
,可以用许多不同的方式来格式化DateTime
对象。 每当我寻找所需的格式,我需要在互联网上search。 几乎总是我find一个我可以使用的例子。 例如:
String.Format("{0:MM/dd/yyyy}", DateTime.Now); // "09/05/2012"
但我不知道它是如何工作的,哪些类支持这些“魔术”附加string。
所以我的问题是:
-
String.Format
如何将附加信息MM/dd/yyyy
映射到string结果? - 所有的Microsoft对象都支持这个function吗?
这是logging在某处吗? - 是否有可能做这样的事情:
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 ,特别是接受formatString
的ToString
方法,并返回相应的格式化string: http : //msdn.microsoft.com/en-us/library/system.iformattable.tostring.aspx
一个IFormatProvider
也可以用来捕获基本的格式标准/默认值等。 这里和这里的例子。
所以你的问题的答案依次为:
-
它在
DateTime
对象上使用IFormattable
接口的ToString()
方法,并传递MM/dd/yyyy
格式的string。 这是返回正确的string的实现。 -
任何实现
IFormattable
对象IFormattable
支持这个特性。 你甚至可以自己写! -
是的,看上面。
从我的理解,你需要在你的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())
-
检查官方的MSDN文档,这里有一个DateTime格式string的完整列表: http : //msdn.microsoft.com/en-us/library/az4se3k1.aspx 。 确实有不less“神奇”的string。
-
据我所知,并非所有types都有“有趣”的格式,但所有types都支持
ToString()
。 如果你需要格式化一个内置的对象,你可以添加一个扩展方法来做到这一点,但是通常格式化是在需要的地方提供的(或者换句话说,我只为自己的types写了自定义的格式化程序) 。 -
是的,你可以写自己的,如果你有不同的格式的数据,你可能应该通过实施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(); }
对于你的问题,
-
String.Format如何将附加信息MM / dd / yyyy映射到string结果?
如上所述,它只是调用IFormattable .ToString(string格式,IFormatProvider提供程序)。 提供者往往是告诉你什么文化是你的系统。 通常为null,因为人们不会像你在你的情况那样通过String.Format()。
-
所有的微软对象都支持这个function吗? 这是logging在某处吗?
任何实现IFormattable的东西都可以。
-
是否有可能做这样的事情:
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()
一样的东西,并得到你指定的输出。
并回答你的第三个问题:这是不可能的这种语法,但你可以提供IFormatProvider
和ICustomFormatter
实例为您没有创build一个types,或实现IFormattable
在你的types(虽然,基本上扩展ToString
)。