IFormatProvider의 기능은 무엇입니까?


93

Datetime.ParseExact 메서드를 가지고 놀았는데 IFormatProvider가 필요합니다.

null 입력으로 작동하지만 정확히 무엇을합니까?


3
DateTime.ParseExact (String, String, IFormatProvider)에 IFormatProvider가 필요한 이유의 중복 가능성이 있습니까? . 나는 더 나은 단어와 더 나은 답변을 가지고 있기 때문에 새로운 것으로 마무리하도록 투표하고 있습니다.
nawfal 2014 년

답변:


61

Ian Boyd의 답변에 추가로 :

또한 CultureInfo이 인터페이스를 구현하고 귀하의 경우에 사용할 수 있습니다. 예를 들어 프랑스어 날짜 문자열을 구문 분석 할 수 있습니다. 당신은 사용할 수 있습니다

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

2
.NET Framework 4.6에서 더 이상 예제와 일치하는 오버로드가없는 것 같습니다. DateTime.ParseExact(string, string, IFormatProvider)대신 사용해야 합니다. 저는 다음과 같이 믿습니다. DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
James King

1
.NET Framework 4.6.2에는 지적 할 때 입력 매개 변수가 없습니다. 두 개만 사용하고 잘 작동합니다 DateTime dt = DateTime.Parse(yourDateInputString, ci);. 답변을 수정하십시오.
개발자

1
죄송합니다. 오랫동안 기한이 지난 답변이 업데이트되었습니다.
Andrei Rînea

49

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);

하지만 그러지 마

그 모든 노력은 이미 당신을 위해 쓰여졌습니다.

의 GET에 DateTimeFormatInfo에서를IFormatProvider :

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

의 GET에 NumberFormatInfo에서를IFormatProvider :

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

의 가치는 IFormatProvider자신의 문화 개체를 만드는 것입니다. 을 구현 IFormatProvider하고 요청한 객체를 반환하는 한 기본 제공 문화권을 우회 할 수 있습니다.

IFormatProvider.NET Framework를 통해 임의의 문화 개체를 전달하는 방법으로 사용할 수도 있습니다 IFormatProvider. 예 : 다른 문화권의 신의 이름

  • 하느님
  • 하느님
  • Jehova
  • 야웨
  • יהוה
  • אהיה אשר אהיה

이를 통해 사용자 정의 LordsNameFormatInfo클래스가 IFormatProvider에서 따라갈 수 있으며 관용구를 보존 할 수 있습니다.

실제로 GetFormatIFormatProvider자신의 메서드 를 호출 할 필요가 없습니다 .

필요할 때마다 객체를 IFormatProvider전달할 수 있습니다 CultureInfo.

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

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

참고 : 모든 코드는 공개 도메인으로 공개됩니다. 귀속이 필요하지 않습니다.


18

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);

2
CultureInfo.InvariantCulture대신 사용해야하는 이유가 CultureInfo.CurrentCulture있습니까?
Stephen Booher 2013 년

5
InvariantCulture는 항상 모든 시스템에 존재하도록 보장되고 항상 동일한 값으로 변환 및 구문 분석되는 특별한 문화입니다. CurrentCulture는 현재 스레드의 문화입니다. 이것은 다를 수 있으며 동일한 문화권을 사용하여 문자열로 변환하고 구문 분석하지 않으면 형식 오류가 발생합니다 ...
Tim

5
@StephenBooher 전달 null은 기본적으로 CultureInfo.CurrentCulture. 참조 소스 의 호출을 참조하십시오. 호출 체인을 따라 가면 결국 null이 출력 DateTimeFormatInfo.CurrentInfo되는 것과 동일한 것으로 대체됩니다 CultureInfo.CurrentCulture.
Scott Chamberlain

InvariantCulture는 제가 찾던 것입니다. 감사합니다
Chicowitz 2019

5

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




2

으로 MSDN

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

  1. NumberFormatInfo특정 문화권에 대한 통화, 천 단위 구분 기호 및 소수 구분 기호와 같이 숫자 형식을 지정하는 데 사용되는 정보를 제공 하는 클래스입니다. NumberFormatInfo개체에서 인식하고 숫자 형식 지정 작업에 사용되는 미리 정의 된 형식 문자열에 대한 자세한 내용 은 표준 숫자 형식 문자열 및 사용자 지정 숫자 형식 문자열 단원을 참조하십시오.
  2. DateTimeFormatInfo특정 문화권의 날짜 및 시간 구분 기호 또는 날짜의 연도, 월, 일 구성 요소의 순서 및 형식과 같이 날짜 및 시간의 형식을 지정하는 데 사용되는 정보를 제공 하는 클래스입니다. DateTimeFormatInfo개체에서 인식하고 숫자 형식 지정 작업에 사용되는 미리 정의 된 형식 문자열에 대한 자세한 내용 은 표준 날짜 및 시간 형식 문자열과 사용자 지정 날짜 및 시간 형식 문자열을 참조하십시오.
  3. CultureInfo특정 문화를 대표하는 클래스. 해당 GetFormat메서드는 개체가 숫자 또는 날짜 및 시간과 관련된 서식 지정 또는 구문 분석 작업에 사용 되는지 여부에 따라 문화권 별 NumberFormatInfo또는 DateTimeFormatInfo개체를 반환합니다 CultureInfo.

.NET Framework는 사용자 지정 서식도 지원합니다. 여기에는 일반적으로 IFormatProvider 및 ICustomFormatter를 모두 구현하는 형식 지정 클래스 생성이 포함됩니다. 그런 다음이 클래스의 인스턴스는와 같은 사용자 지정 형식 지정 작업을 수행하는 메서드에 매개 변수로 전달됩니다 String.Format(IFormatProvider, String, Object[]).


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.