IFormatProvider做什么?

我玩的是Datetime.ParseExact方法,它需要一个IFormatProvider …

它的工作原理是inputnull,但它到底是做什么的?

CultureInfo也实现了这个接口,可以在你的情况下使用。 所以你可以parsing一个法语的datestring, 你可以使用

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

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

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

界面是一个function的网关,从文化中获得一组文化特定的数据。 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); 

但是不要这样做

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

IFormatProvider获取DateTimeFormatInfo

 DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider); 

IFormatProvider获取NumberFormatInfo

 NumberFormatInfo format = NumberFormatInfo.GetInstance(provider); 

IFormatProvider的价值在于您创build自己的文化对象。 只要他们实现IFormatProvider ,并返回它们被请求的对象,就可以绕过内置的文化。

您也可以使用IFormatProvider来传递任意文化对象 – 通过IFormatProvider 。 例如不同文化中的神的名字

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

这可以让你的自定义的LordsNameFormatInfo类在IFormatProvider里面,你可以保留这个习惯用法。

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

每当你需要一个IFormatProvider你可以传递一个CultureInfo对象:

 DateTime.Now.ToString(CultureInfo.CurrentCulture); endTime.ToString(CultureInfo.InvariantCulture); transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc")); 

注意 :任何代码都被释放到公共领域。 不需要归属

传递null作为IFormatProvider不是正确的方法来做到这一点。 如果用户在PC上有自定义date/时间格式,则在分析和转换为string时会遇到问题。 我刚刚修正了一个bug,在转换为string的时候,有人在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); 

你可以在这里看到http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx

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

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

由MSDN

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

  1. NumberFormatInfo类,提供用于格式化数字的信息,例如特定文化的货币,千位分隔符和小数点分隔符符号。 有关由NumberFormatInfo对象识别并用于数字格式操作的预定义格式string的信息,请参阅标准数字格式string和自定义数字格式string。
  2. DateTimeFormatInfo类,它提供用于格式化date和时间的信息,例如特定文化的date和时间分隔符,或date的年,月,日组分的顺序和格式。 有关由DateTimeFormatInfo对象识别并用于数字格式操作的预定义格式string的信息,请参阅标准date和时间格式string以及自定义date和时间格式string。
  3. CultureInfo类代表一种特定的文化。 它的GetFormat方法返回一个文化特定的NumberFormatInfoDateTimeFormatInfo对象,具体取决于CultureInfo对象是否用于涉及数字或date和时间的格式化或parsing操作。

.NET Framework还支持自定义格式。 这通常涉及创build一个实现IFormatProvider和ICustomFormatter的格式化类。 然后将此类的实例作为parameter passing给执行自定义格式操作的方法,如String.Format(IFormatProvider, String, Object[])

DateTimeFormatInfo类实现了这个接口,所以它允许你控制DateTimestring的格式。