随着String.Format()
有可能例如格式化DateTime
在许多不同的方式对象。 每次我要寻找一个所需的格式,我需要四处搜寻互联网上。 几乎总是我发现一个例子,我可以使用。 例如:
String.Format("{0:MM/dd/yyyy}", DateTime.Now); // "09/05/2012"
但是,我没有任何线索,它是如何工作和哪些类支持这些“神奇”的附加字符串。
所以我的问题是:
- 怎样
String.Format
地图附加信息MM/dd/yyyy
为一个字符串的结果? - 是否所有的微软对象支持这个功能吗?
这是记录在案的地方? - 是否有可能做这样的事情:
String.Format("{0:MyCustomFormat}", new MyOwnClass())
String.Format
匹配每个令牌的字符串(内部{0}
等)对相应的对象: 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
也可以使用能够用于捕获基本格式标准/默认值等。实施例在这里和在这里 。
因此,问题的答案依次是:
它使用IFormattable
接口的ToString()
的上方法DateTime
对象,并将该MM/dd/yyyy
格式字符串。 这是返回正确的字符串实施。
实现任何物体IFormattable
支持此功能。 你甚至可以编写自己的!
是的,见上面。
从我的理解,你需要实现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())
在幕后的String.Format做了如下,
IFormattable formattable = objectToFormat as IFormattable;
if (formattable != null)
{
formattable.ToString(objectToFormat);
}
else
{
objectToFormat.ToString();
}
对于您的问题,
如何映射的String.Format附加信息MM / DD / YYYY为一个字符串的结果?
如上所指出的,它只是调用IFormattable的ToString(字符串格式,提供的IFormatProvider)。 该供应商往往是什么,告诉你的文化是你的系统的东西。 常空,因为人们不通过它的String.Format(),你在你的情况一样。
是否所有的微软对象支持这个功能吗? 这是记录在案的地方?
实现IFormattable什么都。
是否有可能做这样的事情: String.Format("{0:MyCustomFormat}, new MyOwnClass())
从本质上讲,如果你希望自己的对象跟你提供实现形式的东西IFormattable
。
内有一个巨大的支持类和枚举,以确保尽管这格式字符串在很大程度上是相似的号码。 这里更多 。
是的,这是可能的 - 它可以完全定制。 看看这个日期和时间自定义格式文档链接。
如果你有自己的对象时,它是由你来重写ToString()
方法和输出不管你觉得是适当名额的代表。 一旦你这样做,你可以使用String.Format("{0:MyCustomFormat}", new MyOwnClass())
因为这隐式调用MyOwnClass.ToString()
对于日期的文档可以在这里找到: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
这应该告诉你到底是什么所有的日期格式字符,例如MM的意思。
如果你想改变一个字符串是如何成为一个自定义类的输出,你可以重写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
你没有创造,或实现类型IFormattable
你的类型中(虽然,基本上延伸ToString
)。