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和时间值的区域性信息:
-
NumberFormatInfo
类,提供用于格式化数字的信息,例如特定文化的货币,千位分隔符和小数点分隔符符号。 有关由NumberFormatInfo
对象识别并用于数字格式操作的预定义格式string的信息,请参阅标准数字格式string和自定义数字格式string。 -
DateTimeFormatInfo
类,它提供用于格式化date和时间的信息,例如特定文化的date和时间分隔符,或date的年,月,日组分的顺序和格式。 有关由DateTimeFormatInfo
对象识别并用于数字格式操作的预定义格式string的信息,请参阅标准date和时间格式string以及自定义date和时间格式string。 -
CultureInfo
类代表一种特定的文化。 它的GetFormat
方法返回一个文化特定的NumberFormatInfo
或DateTimeFormatInfo
对象,具体取决于CultureInfo
对象是否用于涉及数字或date和时间的格式化或parsing操作。
.NET Framework还支持自定义格式。 这通常涉及创build一个实现IFormatProvider和ICustomFormatter的格式化类。 然后将此类的实例作为parameter passing给执行自定义格式操作的方法,如String.Format(IFormatProvider, String, Object[])
。
DateTimeFormatInfo类实现了这个接口,所以它允许你控制DateTimestring的格式。