IFormatProvider 的作用是什么?
-
21-08-2019 - |
题
我正在使用 Datetime.ParseExact 方法,它需要一个 IFormatProvider...
输入 null 就可以了,但是它到底有什么作用呢?
解决方案
在ADITION伊恩·博伊德的回答是:
另外CultureInfo
实现该接口,可以在你的情况中使用。所以,你可以解析例如法国的日期字符串;你可以使用
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
其他提示
这 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
. 。例如。不同文化中神的名字
- 上帝
- 上帝
- 耶霍瓦
- 耶和华
- יהוה
- אהיה אשר אהיה
这让您的定制 LordsNameFormatInfo
类在里面行驶 IFormatProvider
, ,并且您可以保留该习语。
事实上你永远不需要打电话 GetFormat
的方法 IFormatProvider
你自己。
每当你需要一个 IFormatProvider
你可以通过 CultureInfo
目的:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
笔记: :任何代码都会发布到公共领域。无需归属。
空传递作为IFormatProvider
是不这样做的正确方法。如果用户拥有自己的个人电脑上的自定义日期/时间格式,你会在解析和转换为字符串的问题。我刚刚固定转换为字符串时,其中有人已通过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);
您可以在这里看到 http://msdn.microsoft.com/ EN-US /库/ system.iformatprovider.aspx
请参阅上述表示的和实施例部分在那里。
的IFormatProvider 提供文化信息到所讨论的方法。 的DateTimeFormatInfo 实现的IFormatProvider,并允许您指定格式要在要显示你的日期/时间。例如可以在MSDN上的相关网页上找到。
经过 微软软件定义网络
.NET框架包括以下内容 三 预定义的 IFormatProvider 实现提供用于格式化或解析数字、日期和时间值的区域性特定信息:
- 这
NumberFormatInfo
类,它提供用于格式化数字的信息,例如特定区域性的货币、千位分隔符和小数分隔符符号。有关由 a 识别的预定义格式字符串的信息NumberFormatInfo
对象并用于数字格式化操作,请参阅标准数字格式字符串和自定义数字格式字符串。 - 这
DateTimeFormatInfo
类,它提供用于格式化日期和时间的信息,例如特定区域性的日期和时间分隔符或日期的年、月和日组成部分的顺序和格式。有关由 a 识别的预定义格式字符串的信息DateTimeFormatInfo
对象并用于数字格式化操作,请参阅标准日期和时间格式字符串和自定义日期和时间格式字符串。 - 这
CultureInfo
阶级,代表一种特定的文化。它是GetFormat
方法返回特定于文化的NumberFormatInfo
或者DateTimeFormatInfo
对象,取决于是否CultureInfo
对象用于涉及数字或日期和时间的格式化或解析操作。
.NET Framework 还支持自定义格式。这通常涉及创建实现 IFormatProvider 和 ICustomFormatter 的格式化类。然后,此类的实例作为参数传递给执行自定义格式化操作的方法,例如 String.Format(IFormatProvider, String, Object[])
.
在的DateTimeFormatInfo 类实现此界面,因此它允许您控制您的日期时间字符串的格式。