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);
  • 相关阅读:
    编程ING:人人都能学会程序设计
    以拯救之因
    使用交互环境
    使用交互环境 连载3
    深入理解Oracle Exadata
    字符编码
    多语境的操作
    挖掘用户需求
    神一样的产品经理——基于移动与互联网产品实践
    产品各类型之间的关系
  • 原文地址:https://www.cnblogs.com/zitjubiz/p/Custom_IFormatProvider.html
Copyright © 2011-2022 走看看