C# Examples

Menu:


Custom IFormatProvider [C#]

The following example shows how to write a custom IFormatProvider which you can use in method String.Format(I­FormatProvider, …).

This formatter formats doubles to 3 decimal places with a dot separator.

[C#]
public class DoubleFormatter : IFormatProvider, ICustomFormatter
{
  // always use dot separator for doubles
  private CultureInfo enUsCulture = CultureInfo.GetCultureInfo("en-US");

  public string Format(string format, object arg, IFormatProvider formatProvider)
  {
    // format doubles to 3 decimal places
    return string.Format(enUsCulture, "{0:0.000}", arg);
  }

  public object GetFormat(Type formatType)
  {
    return (formatType == typeof(ICustomFormatter)) ? this : null;
  }
}

Having this formatter, we can use it like this:

[C#]
double width = 15.77555;
double height = 12.8497979;
Console.WriteLine(
  string.Format(new DoubleFormatter(), "w={0} h={1}", width, height));

Output:

w=15.776 h=12.850

So now we have a reusable format for doubles – 3 decimal places with dot separator. That is nice, but this formatter is very simple – it formats everything (eg. DateTime) as „0:000“. This is a fast version if you know that you will only use it for formatting lots of doubles.

The real version should look like this:

[C#]
public class DoubleFormatter : IFormatProvider, ICustomFormatter
{
  // always use dot separator for doubles
  private CultureInfo enUsCulture = CultureInfo.GetCultureInfo("en-US");

  public string Format(string format, object arg, IFormatProvider formatProvider)
  {
    if (arg is double)
    {
      if (string.IsNullOrEmpty(format))
      {
        // by default, format doubles to 3 decimal places
        return string.Format(enUsCulture, "{0:0.000}", arg);
      }
      else
      {
        // if user supplied own format use it
        return ((double)arg).ToString(format, enUsCulture);
      }
    }
    // format everything else normally
    if (arg is IFormattable)
      return ((IFormattable)arg).ToString(format, formatProvider);
    else
      return arg.ToString();
  }

  public object GetFormat(Type formatType)
  {
    return (formatType == typeof(ICustomFormatter)) ? this : null;
  }
}

Example:

[C#]
Console.WriteLine(string.Format(new DoubleFormatter(),
 "Numbers {0} and {1:0.0}. Now a string {2}, a number {3}, date {4} and object: {5}",
 1.234567, -0.57123456, "Hi!", 5, DateTime.Now, new object()));

Output:

Numbers 1.235 and -0.6. Now a string Hi!, a number 5, date 12.6.2009 17:11:35
and object: System.Object

Other examples with custom formatters can be found in MSDN. See example with formatter for 12-digit account numbers (12345–678–9012) or example with binary, octal, and hexadecimal formatter.


See also

By Martin Konicek, 22-Jun-2009