programing

IFormatProvider의 역할은 무엇입니까?

lastmemo 2023. 5. 11. 23:26
반응형

IFormatProvider의 역할은 무엇입니까?

나는 Datetime을 가지고 놀고 있었습니다.ParseExact 메서드는 IFormatProvider...를 원합니다.

null을 입력하면 작동합니다만, 정확히 무엇을 하는 것입니까?

Ian Boyd의 답변 외에도:

도.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다음에 대해 쿼리할 수 있습니다.

일반적으로 작동하는 방법은 다음과 같습니다.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);

하지만 그러지 마세요.

그 모든 힘든 일들은 이미 여러분을 위해 쓰여졌습니다.

에서 a를 받는 방법:

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

에서 a를 받는 방법:

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

IFormatProvider자신만의 문화적 대상을 만드는 것입니다.이 그이실는한하행을 실행하는 한.IFormatProvider그리고 그들이 요청한 물건들을 돌려주면, 당신은 내장된 문화를 우회할 수 있습니다.

사용할 수도 있습니다.IFormatProvider임의의 배양 개체를 전달하는 방법 - 를 통해.IFormatProvider예: 다른 문화권에서 신의 이름

  • 신이시여
  • 신이시여
  • 여호바
  • 야훼
  • יהוה
  • אהיה אשר אהיה

를 통해 지정 이를사자정의용해통▁your▁thisLordsNameFormatInfo교실에서 차를 타고 이동하는 것IFormatProvider그리고 당신은 관용구를 보존할 수 있습니다.

실제로는 전화할 필요가 없습니다.GetFormatIFormatProvider네 자신.

IFormatProvider통과할 수 있습니다.CultureInfo객체:

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

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

참고: 모든 코드는 공용 도메인으로 릴리스됩니다.속성이 필요하지 않습니다.

을 null로 합니다.IFormatProvider올바른 방법이 아닙니다.사용자의 PC에 사용자 지정 날짜/시간 형식이 있는 경우 구문 분석 및 문자열로 변환하는 데 문제가 발생합니다.문자열로 변환할 때 누군가가 IFormatProvider로 null을 전달한 버그를 방금 수정했습니다.

에 대신사야합니다해용을 .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);

IFormatProvider는 해당 메서드에 문화 정보를 제공합니다.DateTimeFormatInfo는 IFormatProvider를 구현하며, 이를 통해 날짜/시간을 표시할 형식을 지정할 수 있습니다.예제는 관련 MSDN 페이지에서 확인할 수 있습니다.

http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx 에서 확인할 수 있습니다.

여기에 있는 비고 및 예제 섹션을 참조하십시오.

MSDN 기준

.NET Framework에는 숫자 및 날짜 및 시간 값의 형식 지정 또는 구문 분석에 사용되는 문화별 정보를 제공하기 위해 다음과 같은 세 가지 미리 정의된 IFormProvider 구현이 포함되어 있습니다.

  1. NumberFormatInfo클래스 - 특정 문화에 대한 통화, 천 구분 기호 및 십진수 구분 기호와 같이 숫자 형식을 지정하는 데 사용되는 정보를 제공합니다.에서 인식되는 미리 정의된 형식 문자열에 대한 정보NumberFormatInfo개체 및 숫자 형식 지정 작업에 사용되는 항목은 표준 숫자 형식 문자열 및 사용자 지정 숫자 형식 문자열을 참조하십시오.
  2. DateTimeFormatInfo클래스 - 특정 문화에 대한 날짜 및 시간 구분 기호 또는 날짜의 연도, 월 및 일 구성 요소의 순서 및 형식과 같은 날짜 및 시간 형식을 지정하는 데 사용되는 정보를 제공합니다.에서 인식되는 미리 정의된 형식 문자열에 대한 정보DateTimeFormatInfo개체 및 숫자 형식 지정 작업에 사용되는 항목은 표준 날짜 및 시간 형식 문자열 및 사용자 지정 날짜 및 시간 형식 문자열을 참조하십시오.
  3. CultureInfo특정한 문화를 대표하는 수업.그것의.GetFormat 메드반환합니다로문을 합니다.NumberFormatInfo또는DateTimeFormatInfoobject는 그의, 것여에따의 여부에 .CultureInfo개체는 숫자나 날짜 및 시간을 포함하는 형식 지정 또는 구문 분석 작업에 사용됩니다.

형식도 합니다.NET Framework는 사용자 지정 형식도 지원합니다.여기에는 일반적으로 IFormatProvider와 ICustomFormatter를 모두 구현하는 형식 지정 클래스를 만드는 작업이 포함됩니다. 이 는 사용자 지정됩니다.String.Format(IFormatProvider, String, Object[]).

API는 http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx 에서 확인하십시오.

DateTimeFormatInfo 클래스는 이 인터페이스를 구현하므로 DateTime 문자열의 형식을 제어할 수 있습니다.

이 질문에서는 IFormatProvider 및 DateTime에 대해 질문하지만 의 다른 컨텍스트에서도 IFormatProvider를 사용할 수 있습니다.NET(예: 문자열).포맷.

그런 다음 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과 매우 일반적인 개념.

언급URL : https://stackoverflow.com/questions/506676/what-does-iformatprovider-do

반응형