使用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())
答案 0 :(得分:84)
String.Format
将字符串({0}
等)中的每个标记与相应的对象匹配:http://msdn.microsoft.com/en-us/library/system.string.format.aspx
可选择提供格式字符串:
{ index[,alignment][ : formatString] }
如果提供了formatString
,则相应的对象必须实现IFormattable,特别是接受ToString
的{{1}}方法,并返回相应的格式化字符串:http://msdn.microsoft.com/en-us/library/system.iformattable.tostring.aspx
也可以使用formatString
来捕获基本格式标准/默认值等。示例here和here。
所以按顺序回答你的问题:
它在IFormatProvider
对象上使用IFormattable
接口的ToString()
方法,并传递DateTime
格式字符串。正是该实现返回了正确的字符串。
任何实现MM/dd/yyyy
的对象都支持此功能。你甚至可以写自己的!
是的,见上文。
答案 1 :(得分: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())
答案 2 :(得分:4)
查看官方MSDN文档,这里有完整的DateTime格式字符串列表:http://msdn.microsoft.com/en-us/library/az4se3k1.aspx。确实有不少“神奇”的字符串。
据我所知,并非所有类型都有“有趣”的格式,但所有类型都支持ToString()
。如果您需要格式化内置对象,可以添加扩展方法来执行此操作,但通常格式在任何需要它的地方提供(或换句话说,我只写了我自己的类型的自定义格式化程序。)
是的,您可以自己编写,如果您有可以使用不同方式格式化的数据,您可能应该通过实施IFormattable编写自定义格式化程序,请再次参阅此处的文档:http://msdn.microsoft.com/en-us/library/system.iformattable.aspx。这很简单,你只需检查提供的字符串并根据这些字符写出你的数据,幕后没有魔法: - )
答案 3 :(得分:3)
在封面下String.Format执行如下操作,
IFormattable formattable = objectToFormat as IFormattable;
if (formattable != null)
{
formattable.ToString(objectToFormat);
}
else
{
objectToFormat.ToString();
}
如有问题,
String.Format如何将附加信息MM / dd / yyyy映射到字符串结果?
如上所述,它只调用IFormattable .ToString(字符串格式,IFormatProvider提供程序)。提供者通常会告诉您系统的文化。通常为null,因为人们没有像你的情况那样传递String.Format()。
所有微软对象都支持此功能吗?这是在某处记录的吗?
实施IFormattable的任何事情都可以。
是否可以执行以下操作:String.Format("{0:MyCustomFormat}, new MyOwnClass())
基本上,如果您希望自己的对象使用所提供的格式执行某些操作,请执行IFormattable
。
有大量的支持类和枚举器可以确保格式字符串基本上类似。 More here
答案 4 :(得分:0)
是的,它是可能的 - 它可以完全定制。查看有关日期和时间自定义格式的this文档链接。
如果您有自己的对象,则由您覆盖ToString()
方法并输出您认为适当的表示形式。执行此操作后,您可以使用String.Format("{0:MyCustomFormat}", new MyOwnClass())
,因为这会隐式调用MyOwnClass.ToString()
答案 5 :(得分:0)
日期文档可在此处找到: 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()
之类的操作并获取您指定的输出。
答案 6 :(得分:0)
并回答您的第三个问题:使用此语法无法做到这一点,但您可以为未创建的类型提供IFormatProvider
和ICustomFormatter
的实例,或者实现IFormattable
在你的类型中(尽管,这基本上扩展了ToString
)。