当前位置:  开发笔记 > 编程语言 > 正文

IFormatProvider做什么?

如何解决《IFormatProvider做什么?》经验,为你挑选了4个好方法。

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

它可以输入null,但它到底是做什么的?



1> Andrei Rînea..:

对Ian Boyd的回答是:

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

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


在.NET Framework 4.6中似乎没有与您的示例匹配的重载.你必须使用`DateTime.ParseExact(string,string,IFormatProvider)`,我相信 - 就像这样:`DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)`

2> Ian Boyd..:

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"));

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



3> Tim..:

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

相反,你应该使用 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);


传入`null`的@StephenBooher将默认为`CultureInfo.CurrentCulture`.请参阅[参考源代码]中的调用(http://referencesource.microsoft.com/mscorlib/a.html#bfc8add12515d311),如果您遵循调用链,则null最终将替换为[`DateTimeFormatInfo.CurrentInfo` ](http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.currentinfo(v = vs.110).aspx),相当于`CultureInfo.CurrentCulture`输出的内容.
InvariantCulture是一种特殊的文化,保证始终存在于任何机器上,并始终转换和解析回相同的值.CurrentCulture是当前线程的文化.这可能会有所不同,如果您不使用相同的文化转换为字符串和解析,您将得到格式错误...
有什么理由我们应该使用`CultureInfo.InvariantCulture`而不是`CultureInfo.CurrentCulture`?

4> Raithlin..:

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

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有