的String.Format - 它是如何工作以及如何实现自定义formatstrings(Str

2019-06-24 07:17发布

随着String.Format()有可能例如格式化DateTime在许多不同的方式对象。 每次我要寻找一个所需的格式,我需要四处搜寻互联网上。 几乎总是我发现一个例子,我可以使用。 例如:

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

但是,我没有任何线索,它是如何工作和哪些类支持这些“神奇”的附加字符串。

所以我的问题是:

  1. 怎样String.Format地图附加信息MM/dd/yyyy为一个字符串的结果?
  2. 是否所有的微软对象支持这个功能吗?
    这是记录在案的地方?
  3. 是否有可能做这样的事情:
    String.Format("{0:MyCustomFormat}", new MyOwnClass())

Answer 1:

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也可以使用能够用于捕获基本格式标准/默认值等。实施例在这里和在这里 。

因此,问题的答案依次是:

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

  2. 实现任何物体IFormattable支持此功能。 你甚至可以编写自己的!

  3. 是的,见上面。



Answer 2:

从我的理解,你需要实现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())


Answer 3:

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

  2. 据我所知,并非所有类型的具有“有趣”的格式,但所有类型支持ToString() 如果您需要格式化对象内置您可以添加一个扩展方法来做到这一点,但通常格式化时,在需要的任何地方提供(或者换一种说法,我只写了自定义格式为我自己的类型) 。

  3. 是的,你可以写自己的,如果你有一个可以以不同的方式进行格式化数据你应该通过实现IFormattable编写自定义格式,在这里再次看到文档: http://msdn.microsoft.com/en-us/库/ system.iformattable.aspx 。 这是相当简单,只需检查所提供的字符串,并写出基于这些数据,有幕后没有魔法:-)



Answer 4:

在幕后的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)。 该供应商往往是什么,告诉你的文化是你的系统的东西。 常空,因为人们不通过它的String.Format(),你在你的情况一样。

  2. 是否所有的微软对象支持这个功能吗? 这是记录在案的地方?

    实现IFormattable什么都。

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

    从本质上讲,如果你希望自己的对象跟你提供实现形式的东西IFormattable

内有一个巨大的支持类和枚举,以确保尽管这格式字符串在很大程度上是相似的号码。 这里更多 。



Answer 5:

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

如果你有自己的对象时,它是由你来重写ToString()方法和输出不管你觉得是适当名额的代表。 一旦你这样做,你可以使用String.Format("{0:MyCustomFormat}", new MyOwnClass())因为这隐式调用MyOwnClass.ToString()



Answer 6:

对于日期的文档可以在这里找到: 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()让你指定的输出。



Answer 7:

并回答你的第三个问题:这是不可能的,这种语法,但您可以提供的情况下IFormatProviderICustomFormatter你没有创造,或实现类型IFormattable你的类型中(虽然,基本上延伸ToString )。



文章来源: String.Format - how it works and how to implement custom formatstrings