String.Format - how it works and how to implement custom formatstrings

.net, c#, string, string-formatting, vb.net

Solution

`String.Format` matches each of the tokens inside the string (`{0}` etc) against the corresponding object: https://learn.microsoft.com/en-us/dotnet/api/system.string.format#overloads

A format string is optionally provided:

`{ index[,alignment][ : formatString] }`

If `formatString` is provided, the corresponding object must implement IFormattable and specifically the `ToString` method that accepts `formatString` and returns the corresponding formatted string: https://learn.microsoft.com/en-us/dotnet/api/system.iformattable.tostring

An `IFormatProvider` may also be used to capture basic formatting standards/defaults etc. Examples here and here.

So the answers to your questions in order:

It uses the `IFormattable` interface's `ToString()` method on the `DateTime` object and passes that the `MM/dd/yyyy` format string. It is that implementation which returns the correct string.

Any object that implement `IFormattable` supports this feature. You can even write your own!

Yes, see above.

Problem

With `String.Format()` it is possible to format for example `DateTime` objects in many different ways. Every time I am looking for a desired format I need to search around on Internet. Almost always I find an example I can use. For example: ``` String.Format("{0:MM/dd/yyyy}", DateTime.Now); // "09/05/2012" ``` But I don't have any clue how it works and which classes support these 'magic' additional strings. So my questions are: - How does `String.Format` map the additional information `MM/dd/yyyy` to a string result? - Do all Microsoft objects support this feature? Is this documented somewhere? - Is it possible to do something like this: `String.Format("{0:MyCustomFormat}", new MyOwnClass())`

Original source

Related problems