Format-如何工作以及如何实现自定义格式字符串

使用 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())
36299 次浏览

是的,这是可能的-它可以完全定制。看看 这个的日期和时间自定义格式。

如果您有自己的对象,则由您重写 ToString()方法并输出您认为合适的表示形式。这样做之后,就可以使用 String.Format("{0:MyCustomFormat}", new MyOwnClass()),因为它隐式地调用 MyOwnClass.ToString()

根据我的理解,您需要在类中实现 IFormattable 来支持这一点。然后有一个方法 ToString,它接受传递给 String 的参数。格式。

这里有一个例子。

// 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())

有关日期的文档可以在这里找到: 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()的操作并获得您指定的输出。

String.Format将字符串({0}等)中的每个标记与对应的对象 https://learn.microsoft.com/en-us/dotnet/api/system.string.format#overloads进行匹配

可选地提供格式字符串:

{ index[,alignment][ : formatString] }

如果提供了 formatString,则相应的对象必须实现 IFormattable 格式化,特别是接受 formatString并返回相应格式化字符串 https://learn.microsoft.com/en-us/dotnet/api/system.iformattable.tostringToString方法

IFormatProvider也可以用来捕获基本的格式标准/默认值等。

你们问题的答案依次是:

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

  2. 任何实现 IFormattable的对象都支持这个特性。你甚至可以自己编写!

  3. 是的,看上面。

  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。这非常简单,只需检查提供的字符串,并基于这些字符串写出数据,幕后并没有什么神奇的东西: -)

回答你的第三个问题: 这种语法是不可能的,但是你可以为你没有创建的类型提供 IFormatProviderICustomFormatter的实例,或者在你的类型中实现 IFormattable(虽然,这基本上扩展了 ToString)。

在表面之下,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。格式() ,就像您在本例中所做的那样。

  2. 是否所有的微软对象都支持这个特性? 是否有文档记录?

    任何实现 IFormattable 的东西都可以。

  3. 有没有可能做这样的事情: String.Format("{0:MyCustomFormat}, new MyOwnClass())

    实际上,如果您希望自己的对象使用实现 IFormattable的格式执行某些操作。

有大量的支持类和枚举器来确保格式字符串与 很大程度上相似。这里还有.