IFormatProvider做什么?

时间:2009-02-03 10:46:37

标签: c# asp.net iformatprovider

我正在使用Datetime.ParseExact方法,它想要一个IFormatProvider ......

输入null是有效的,但它到底是做什么的?

9 个答案:

答案 0 :(得分:54)

除了Ian Boyd的回答:

同样CultureInfo实现了此接口,可以在您的情况下使用。所以你可以解析一个法国日期字符串,例如;你可以用

var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);

答案 1 :(得分:40)

IFormatProvider接口通常由CultureInfo类为您实现,例如:

  • CultureInfo.CurrentCulture
  • CultureInfo.CurrentUICulture
  • CultureInfo.InvariantCulture
  • CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)

接口是一个函数的网关,用于从文化中获取一组特定于文化的数据。可以查询IFormatProvider的两个常用文化对象是:

  • DateTimeFormatInfo
  • NumberFormatInfo

通常的工作方式是让IFormatProvider给你一个DateTimeFormatInfo对象:

DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
   DoStuffWithDatesOrTimes(format);

还有内部知识,任何IFormatProvider接口可能由来自CultureInfo或从DateTimeFormatInfo下降的类实现,因此您可以直接转换接口:

CultureInfo info = provider as CultureInfo;
if (info != null)
   format = info.DateTimeInfo;
else
{
   DateTimeFormatInfo dtfi = provider as DateTimeFormatInfo;
   if (dtfi != null)
       format = dtfi;
   else
       format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
}

if (format != null)
   DoStuffWithDatesOrTimes(format);

但不要那样做

所有这些辛苦的工作已经为你写了:

DateTimeFormatInfo 获取IFormatProvider

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

NumberFormatInfo 获取IFormatProvider

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

IFormatProvider的值是您创建自己的文化对象。只要他们实现IFormatProvider并返回他们被要求的对象,您就可以绕过内置文化。

您还可以使用IFormatProvider来传递任意文化对象 - 通过IFormatProvider。例如。不同文化中的上帝之名

  • Jehova
  • Yahwe
  • יהוה
  • אהיהאשראהיה

这样,您的自定义LordsNameFormatInfo课程就可以在IFormatProvider内进行,您可以保留这个习语。

实际上,您永远不需要自己调用GetFormat IFormatProvider方法。

每当您需要IFormatProvider时,您都可以传递CultureInfo对象:

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
  

注意:任何代码都会发布到公共域中。无需归属。

答案 2 :(得分:16)

传递null为IFormatProvider不是正确的方法。如果用户的PC上有自定义日期/时间格式,则在解析和转换为字符串时会遇到问题。我刚刚修正了一个错误,当有人在转换为字符串时将其作为IFormatProvider传递null。

相反,您应该使用CultureInfo.InvariantCulture

错:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);

正确:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);

答案 3 :(得分:5)

您可以在此处查看http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx

请参阅那里的备注和示例部分。

答案 4 :(得分:5)

IFormatProvider为相关方法提供文化信息。 DateTimeFormatInfo实现了IFormatProvider,并允许您指定希望显示日期/时间的格式。示例可以在相关的MSDN页面上找到。

答案 5 :(得分:2)

答案 6 :(得分:2)

MSDN

.NET Framework包含以下三个预定义的IFormatProvider实现,以提供用于格式化或解析数字和日期和时间值的特定于区域性的信息:

  1. NumberFormatInfo类,它提供用于格式化数字的信息,例如特定区域性的货币,千位分隔符和小数分隔符号。有关NumberFormatInfo对象识别并在数字格式设置操作中使用的预定义格式字符串的信息,请参阅标准数字格式字符串和自定义数字格式字符串。
  2. DateTimeFormatInfo类,提供用于格式化日期和时间的信息,例如特定文化的日期和时间分隔符号,或者日期和月份的顺序和格式和日组件。有关DateTimeFormatInfo对象识别并在数字格式设置操作中使用的预定义格式字符串的信息,请参阅标准日期和时间格式字符串以及自定义日期和时间格式字符串。
  3. 代表特定文化的CultureInfo类。其GetFormat方法返回特定于区域性的NumberFormatInfoDateTimeFormatInfo对象,具体取决于CultureInfo对象是否用于涉及数字或日期和时间的格式化或解析操作
  4. .NET Framework还支持自定义格式。这通常涉及创建实现IFormatProvider和ICustomFormatter的格式化类。然后将此类的实例作为参数传递给执行自定义格式化操作的方法,例如String.Format(IFormatProvider, String, Object[])

答案 7 :(得分:1)

DateTimeFormatInfo类实现了此接口,因此它允许您控制DateTime字符串的格式。

答案 8 :(得分:0)

该问题询问了 IFormatProvider 和 DateTime,但您也可以在 .NET 的其他上下文中使用 IFormatProvider,例如 string.Format。

然后您传入 IFormatProvider 实例,您可以通过实现 IFormatProvider 指定如何为对象格式化字符串。因此,在 .NET 中,IFormatProvider 和相关的 ICustomFormatter 接口的用法比仅用于日期更广泛。

例如考虑这个实现:

using System;

namespace ConsoleApp
{
    class EmployeeProductivityFormatProvider : IFormatProvider, ICustomFormatter
    {
        public string Format(string format, object arg, IFormatProvider formatProvider)
        {
            int rating = (int)arg;

            if (rating == 0)
            {
                return $"{rating} (new employee)";
            }

            if (rating > 0)
            {
                return $"{rating} (good employee)";
            }

            return $"{rating} (bad employee)";
        }

        public object GetFormat(Type formatType)
        {
            if (formatType == typeof(ICustomFormatter))
            {
                return this;
            }

            return null;
        }
    }
}

现在我们可以通过指定一个 int 值来获取员工的字符串表示:

    string prod = string.Format(new EmployeeProductivityFormatProvider(),
                                "Productivity rating: {0}",
                                employee.ProductivityRating);

说到 DateTime,有很多已经创建的 IFormatProvider 实现可供选择。这是将对象表示为字符串并在 .NET 中指定其格式的一种非常灵活的方式,也是一个非常通用的概念。