IFormatProvider 接口通常由CultureInfo 类为您实现,例如:
CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
接口是函数从文化中获取一组文化特定数据的网关。可以查询IFormatProvider 的两个常用区域性对象是:
它通常的工作方式是让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 的优点是您可以创建自己的文化对象。只要他们实现IFormatProvider,并返回他们要求的对象,你就可以绕过内置的文化。
您还可以使用IFormatProvider 传递任意文化对象 - 通过IFormatProvider。例如。不同文化中的上帝之名
- 神
- 上帝
- 耶和华
- 耶和华
- 耶和华神
- אהיה אשר אהיה
这让您的自定义 LordsNameFormatInfo 类可以在 IFormatProvider 中运行,并且您可以保留成语。
实际上,您永远不需要自己调用IFormatProvider 的GetFormat 方法。
当您需要IFormatProvider 时,您可以传递CultureInfo 对象:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
注意:任何代码都会发布到公共领域。无需署名。