首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IFormatProvider是做什么的?

IFormatProvider是做什么的?
EN

Stack Overflow用户
提问于 2009-02-03 18:46:37
回答 9查看 136.1K关注 0票数 99

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

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-02-04 13:13:48

除了Ian Boyd的回答:

此外,CultureInfo还实现了此接口,并且可以在您的案例中使用。例如,您可以解析一个法语日期字符串;您可以使用

代码语言:javascript
复制
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
票数 65
EN

Stack Overflow用户

发布于 2013-08-13 03:41:57

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

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

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

它通常的工作方式是请求IFormatProvider为您提供一个DateTimeFormatInfo对象:

代码语言:javascript
复制
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
   DoStuffWithDatesOrTimes(format);

还有一些内部知识,即任何IFormatProvider接口都可能是由从CultureInfo派生或从DateTimeFormatInfo派生的类实现的,因此您可以直接转换该接口:

代码语言:javascript
复制
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获取

代码语言:javascript
复制
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

用于从NumberFormatInfo IFormatProvider获取

代码语言:javascript
复制
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

IFormatProvider的价值在于您可以创建自己的区域性对象。只要它们实现IFormatProvider并返回请求的对象,就可以绕过内置的区域性。

您还可以通过IFormatProviderIFormatProvider用作传递任意区域性对象的一种方式。在不同的文化中上帝的名字

  • god
  • God
  • Jehova
  • Yahwe
  • יהוה
  • אהיה

אשראהיה

这使您的自定义LordsNameFormatInfo类可以在IFormatProvider中运行,并且您可以保留习惯用法。

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

无论何时需要IFormatProvider,都可以传递一个CultureInfo对象:

代码语言:javascript
复制
DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

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

Note:任何代码都会发布到公共领域。不需要属性。

票数 49
EN

Stack Overflow用户

发布于 2013-01-07 19:26:43

将null作为IFormatProvider传递不是正确的方法。如果用户在他们的PC上有一个自定义的日期/时间格式,那么在解析和转换为字符串时就会出现问题。我刚刚修复了一个错误,在转换为字符串时,有人将null作为IFormatProvider进行了传递。

相反,您应该使用CultureInfo.InvariantCulture

错误:

代码语言:javascript
复制
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);

正确:

代码语言:javascript
复制
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/506676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档