zoukankan      html  css  js  c++  java
  • Custom IFormatProvider

    The following example shows how to write a custom IFormatProvider which you can use in methodString.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.

    IFormatProvider for Numbers [C#]

    http://www.csharp-examples.net/iformatprovider-numbers/

    This example shows how to convert float to string and string to float using IFormatProvider. To get IFormatProvider you need to get CultureInfo instance first.

    Get invariant or specific CultureInfo

    Invariant culture is a special type of culture which is culture-insensitive. You should use this culture when you need culture-independent results, e.g. when you format or parse values in XML file. The invariant culture is internally associated with the English language. To get invariantCultureInfo instance use static property CultureInfo.In­variantCulture.

    To get specific CultureInfo instance use static method CultureInfo.Get­CultureInfo with the specific culture name, e.g. for the German language CultureInfo.GetCultureInfo("de-DE").

    Format and parse numbers using the IFormatProvider

    Once you have the CultureInfo instance use property CultureInfo.Num­berFormat to get anIFormatProvider for numbers (the NumberFormatInfo object)

    [C#]

    // format float to string
    float num = 1.5f;
    string str = num.ToString(CultureInfo.InvariantCulture.NumberFormat); // "1.5"
    string str = num.ToString(CultureInfo.GetCultureInfo("de-DE").NumberFormat); // "1,5"

    [C#]

    // parse float from string
    float num = float.Parse("1.5", CultureInfo.InvariantCulture.NumberFormat);
    float num = float.Parse("1,5", CultureInfo.GetCultureInfo("de-DE").NumberFormat);
  • 相关阅读:
    A. Greg and Array 夜
    zoj 2314 Reactor Cooling 夜
    sgu 104. Little shop of flowers 夜
    C. Greg and Friends 夜
    sgu 103. Traffic Lights 夜
    B. Greg and Graph 夜
    B. Yaroslav and Two Strings 夜
    zoj 2313 Chinese Girls' Amusement 夜
    sgu 101. Domino 夜
    hdu 4532 湫秋系列故事——安排座位 夜
  • 原文地址:https://www.cnblogs.com/zitjubiz/p/Custom_IFormatProvider.html
Copyright © 2011-2022 走看看