DateTimeFormatInfo? format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
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);
9条答案
按热度按时间wwtsj6pe1#
在Ian Boyd's answer的补充中:
CultureInfo
也实现了这个接口,可以在您的案例中使用。例如,你可以解析一个法国日期字符串;你可以用snvhrwxg2#
IFormatProvider
接口通常由CultureInfo
类实现,例如:CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
该接口是函数从区域性获取一组区域性特定数据的网关。
IFormatProvider
可以查询的两个常用区域性对象是:DateTimeFormatInfo
:IFormatProvider.GetFormat(typeof(DateTimeFormatInfo));
NumberFormatInfo
:IFormatProvider.GetFormat(typeof(NumberFormatInfo));
它通常的工作方式是你要求
IFormatProvider
给予你一个DateTimeFormatInfo
对象:还有内部知识,任何
IFormatProvider
接口都可能由CultureInfo
或DateTimeFormatInfo
的继承类实现,因此您可以直接转换接口:但别那么做
所有这些辛苦的工作都已经为你写好了:
从
IFormatProvider
获取DateTimeFormatInfo
:从
IFormatProvider
获取NumberFormatInfo
:IFormatProvider
的优点是您可以创建自己的区域性对象。只要它们实现了IFormatProvider
,并返回所要求的对象,就可以绕过内置的区域性。您还可以使用
IFormatProvider
作为传递任意区域性对象的方式-通过IFormatProvider
。不同文化中神的名字这使您的自定义
LordsNameFormatInfo
类可以在IFormatProvider
中沿着,并且您可以保留这种习惯用法。实际上,你永远不需要自己调用
IFormatProvider
的GetFormat
方法。每当你需要一个
IFormatProvider
时,你可以传递一个CultureInfo
对象:注:任何代码都是公开发布的。无需归因。
khbbv19g3#
传递null作为
IFormatProvider
不是正确的方法。如果用户在其PC上有自定义日期/时间格式,则在解析和转换为字符串时会出现问题。我刚刚修复了一个错误,在转换为字符串时,有人将null作为IFormatProvider传递。您应该使用
CultureInfo.InvariantCulture
错误:
正确:
pkwftd7m4#
IFormatProvider为所讨论的方法提供区域性信息。DateTimeFormatInfo实现IFormatProvider,并允许您指定希望显示日期/时间的格式。可以在相关的MSDN页面上找到示例。
zc0qhyus5#
你可以在这里看到http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
请参见此处的备注和示例部分。
wn9m85ua6#
通过MSDN
.NET Framework包括以下三个预定义IFormatProvider实现,以提供特定于区域性的信息,这些信息用于格式化或分析数字值以及日期和时间值:
NumberFormatInfo
类,它提供用于设置数字格式的信息,如特定区域性的货币、千位分隔符和小数点分隔符符号。有关NumberFormatInfo
对象可识别并用于数字格式设置操作的预定义格式字符串的信息,请参阅标准数字格式字符串和自定义数字格式字符串。DateTimeFormatInfo
类,它提供用于设置日期和时间格式的信息,例如特定区域性的日期和时间分隔符符号或日期的年、月和日组件的顺序和格式。有关DateTimeFormatInfo
对象可识别并用于数字格式设置操作的预定义格式字符串的信息,请参阅标准日期和时间格式字符串和自定义日期和时间格式字符串。CultureInfo
类,表示特定区域性。它的GetFormat
方法返回特定于区域性的NumberFormatInfo
或DateTimeFormatInfo
对象,具体取决于CultureInfo
对象是用于涉及数字还是日期和时间的格式化操作还是分析操作。.NET Framework还支持自定义格式。这通常涉及创建一个实现IFormatProvider和ICustomFormatter的格式化类。然后将该类的示例作为参数传递给执行自定义格式化操作的方法,如
String.Format(IFormatProvider, String, Object[])
。zpjtge227#
检查http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx以获取API。
ezykj2lf8#
DateTimeFormatInfo类实现了这个接口,因此它允许您控制DateTime字符串的格式。
dsekswqp9#
这个问题询问了IFormatProvider和DateTime,但是你也可以在.NET的其他上下文中使用IFormatProvider,比如string.Format。
然后传入IFormatProvider示例,通过实现IFormatProvider可以指定如何为对象格式化字符串。因此,IFormatProvider和相关的ICustomFormatter接口在.NET中的使用范围比仅用于日期更广。
例如,考虑该实现:
现在我们可以通过指定一个int值来获得一个雇员的字符串表示,如下所示:
在DateTime方面,有很多已经创建的IFormatProvider实现可供选择。这是一种非常灵活的方法,可以将对象表示为字符串并在.NET中指定其格式,也是一个非常通用的概念。