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

时间:2012-05-09 08:20:08

标签: c# .net vb.net string string-formatting

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

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

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

所以我的问题是:

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

7 个答案:

答案 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来捕获基本格式标准/默认值等。示例herehere

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

  1. 它在IFormatProvider对象上使用IFormattable接口的ToString()方法,并传递DateTime格式字符串。正是该实现返回了正确的字符串。

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

  3. 是的,见上文。

答案 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)

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

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

  3. 是的,您可以自己编写,如果您有可以使用不同方式格式化的数据,您可能应该通过实施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();
}

如有问题,

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

    如上所述,它只调用IFormattable .ToString(字符串格式,IFormatProvider提供程序)。提供者通常会告诉您系统的文化。通常为null,因为人们没有像你的情况那样传递String.Format()。

  2. 所有微软对象都支持此功能吗?这是在某处记录的吗?

    实施IFormattable的任何事情都可以。

  3. 是否可以执行以下操作:String.Format("{0:MyCustomFormat}, new MyOwnClass())

    基本上,如果您希望自己的对象使用所提供的格式执行某些操作,请执行IFormattable

  4. 有大量的支持类和枚举器可以确保格式字符串基本上类似。 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)

并回答您的第三个问题:使用此语法无法做到这一点,但您可以为未创建的类型提供IFormatProviderICustomFormatter的实例,或者实现IFormattable在你的类型中(尽管,这基本上扩展了ToString)。