asp.net IFormatProvider是做什么的?

zazmityj  于 2023-06-07  发布在  .NET
关注(0)|答案(9)|浏览(811)

我正在使用Datetime.ParseExact方法,它需要一个IFormatProvider
它以null作为输入,但它到底做了什么?

wwtsj6pe

wwtsj6pe1#

Ian Boyd's answer的补充中:
CultureInfo也实现了这个接口,可以在您的案例中使用。例如,你可以解析一个法国日期字符串;你可以用

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

snvhrwxg2#

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接口都可能由CultureInfoDateTimeFormatInfo的继承类实现,因此您可以直接转换接口:

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。不同文化中神的名字

  • 上帝啊
  • 约瓦
  • 亚维
  • Yehow
  • 你好

这使您的自定义LordsNameFormatInfo类可以在IFormatProvider中沿着,并且您可以保留这种习惯用法。
实际上,你永远不需要自己调用IFormatProviderGetFormat方法。
每当你需要一个IFormatProvider时,你可以传递一个CultureInfo对象:

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

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

:任何代码都是公开发布的。无需归因。

khbbv19g

khbbv19g3#

传递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);
pkwftd7m

pkwftd7m4#

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

zc0qhyus

zc0qhyus5#

你可以在这里看到http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
请参见此处的备注和示例部分。

wn9m85ua

wn9m85ua6#

通过MSDN
.NET Framework包括以下三个预定义IFormatProvider实现,以提供特定于区域性的信息,这些信息用于格式化或分析数字值以及日期和时间值:

  1. NumberFormatInfo类,它提供用于设置数字格式的信息,如特定区域性的货币、千位分隔符和小数点分隔符符号。有关NumberFormatInfo对象可识别并用于数字格式设置操作的预定义格式字符串的信息,请参阅标准数字格式字符串和自定义数字格式字符串。
  2. DateTimeFormatInfo类,它提供用于设置日期和时间格式的信息,例如特定区域性的日期和时间分隔符符号或日期的年、月和日组件的顺序和格式。有关DateTimeFormatInfo对象可识别并用于数字格式设置操作的预定义格式字符串的信息,请参阅标准日期和时间格式字符串和自定义日期和时间格式字符串。
  3. CultureInfo类,表示特定区域性。它的GetFormat方法返回特定于区域性的NumberFormatInfoDateTimeFormatInfo对象,具体取决于CultureInfo对象是用于涉及数字还是日期和时间的格式化操作还是分析操作。
    .NET Framework还支持自定义格式。这通常涉及创建一个实现IFormatProvider和ICustomFormatter的格式化类。然后将该类的示例作为参数传递给执行自定义格式化操作的方法,如String.Format(IFormatProvider, String, Object[])
ezykj2lf

ezykj2lf8#

DateTimeFormatInfo类实现了这个接口,因此它允许您控制DateTime字符串的格式。

dsekswqp

dsekswqp9#

这个问题询问了IFormatProvider和DateTime,但是你也可以在.NET的其他上下文中使用IFormatProvider,比如string.Format。
然后传入IFormatProvider示例,通过实现IFormatProvider可以指定如何为对象格式化字符串。因此,IFormatProvider和相关的ICustomFormatter接口在.NET中的使用范围比仅用于日期更广。
例如,考虑该实现:

using System;

namespace ConsoleApp
{
    class EmployeeProductivityFormatProvider : IFormatProvider, ICustomFormatter
    {
        public string Format(string format, object arg, IFormatProvider formatProvider)
        {
            int rating = (int)arg;

            if (rating == 0)
            {
                return $"{rating} (new employee)";
            }

            if (rating > 0)
            {
                return $"{rating} (good employee)";
            }

            return $"{rating} (bad employee)";
        }

        public object GetFormat(Type formatType)
        {
            if (formatType == typeof(ICustomFormatter))
            {
                return this;
            }

            return null;
        }
    }
}

现在我们可以通过指定一个int值来获得一个雇员的字符串表示,如下所示:

string prod = string.Format(new EmployeeProductivityFormatProvider(),
                                "Productivity rating: {0}",
                                employee.ProductivityRating);

在DateTime方面,有很多已经创建的IFormatProvider实现可供选择。这是一种非常灵活的方法,可以将对象表示为字符串并在.NET中指定其格式,也是一个非常通用的概念。

相关问题