[c#] String.Format-작동 방식 및 사용자 지정 형식 문자열 구현 방법

으로 String.Format()는, 예를 들어 포맷 할 수 있습니다 DateTime다양한 방법으로 객체. 원하는 형식을 찾을 때마다 인터넷에서 검색해야합니다. 거의 항상 사용할 수있는 예를 찾습니다. 예를 들면 :

String.Format("{0:MM/dd/yyyy}", DateTime.Now);          // "09/05/2012"

그러나 나는 그것이 어떻게 작동하는지, 어떤 클래스가 이러한 ‘마법’추가 문자열을 지원하는지 전혀 알지 못합니다.

그래서 내 질문은 다음과 같습니다.

  1. String.Format추가 정보 MM/dd/yyyy를 문자열 결과에 어떻게 매핑 합니까?
  2. 모든 Microsoft 개체가이 기능을 지원합니까?
    어딘가에 문서화되어 있습니까?
  3. 다음과 같이 할 수 있습니까?
    String.Format("{0:MyCustomFormat}", new MyOwnClass())



답변

String.Format{0}해당 개체에 대해 문자열 ( 등) 내의 각 토큰을 찾습니다 . http://msdn.microsoft.com/en-us/library/system.string.format.aspx

선택적으로 형식 문자열이 제공됩니다.

{ index[,alignment][ : formatString] }

formatString가 제공되는 경우 해당 개체는 IFormattable을 구현 해야 하며 특히 해당 서식이 지정된 문자열 ToString을 수락 formatString하고 반환하는 메서드 ( http://msdn.microsoft.com/en-us/library/system.iformattable.tostring.aspx)를 구현해야합니다 .

IFormatProvider또한 등의 예를 기본 포맷 표준 / 기본값을 캡처하는 데 사용할 수있는 사용 할 수 있습니다 여기여기 .

따라서 질문에 대한 답변은 다음과 같습니다.

  1. 개체 에 대한 IFormattable인터페이스의 ToString()메서드를 사용하고 형식 문자열을 DateTime전달 MM/dd/yyyy합니다. 올바른 문자열을 반환하는 구현입니다.

  2. 구현 IFormattable하는 모든 개체 는이 기능을 지원합니다. 직접 작성할 수도 있습니다!

  3. 예, 위를 참조하십시오.


답변

내 이해에서이를 지원하려면 클래스에서 IFormattable을 구현해야합니다. 그런 다음 String.Format에 전달하는 매개 변수를 사용하는 ToString 메서드가 있습니다.

여기에 예가 있습니다.

// Define other methods and classes here
public class Sample : IFormattable
{
     public string ToString(string format, IFormatProvider provider)
     {
         return String.Concat("Your custom format was ", format);
     }
}

String.Format("{0:MyCustomFormat}", new Sample())


답변

  1. 공식 MSDN 문서를 확인하십시오. DateTime 형식 문자열의 전체 목록은 http://msdn.microsoft.com/en-us/library/az4se3k1.aspx 입니다. 실제로 꽤 많은 “마법”문자열이 있습니다.

  2. 내가 아는 한 모든 유형에 “흥미로운”형식이있는 것은 아니지만 모든 유형이 ToString(). 내장 된 개체의 형식을 지정해야하는 경우 확장 메서드를 추가하여 수행 할 수 있지만 일반적으로 형식이 필요한 곳이면 어디에서나 제공됩니다 (또는 다른 방식으로 표현하기 위해 고유 한 형식에 대한 사용자 지정 형식 지정자 만 작성했습니다). .

  3. 예, 직접 작성할 수 있으며 다른 방식으로 서식을 지정할 수있는 데이터가있는 경우 IFormattable을 구현하여 사용자 지정 포맷터를 작성해야합니다. http://msdn.microsoft.com/en-us/ 문서를 다시 참조하십시오. library / system.iformattable.aspx . 매우 간단합니다. 제공된 문자열을 확인하고이를 기반으로 데이터를 작성하면됩니다.


답변

커버 아래에서 String.Format은 다음과 같은 작업을 수행합니다.

IFormattable formattable = objectToFormat as IFormattable;
if (formattable != null)
{
    formattable.ToString(objectToFormat);
}
else
{
    objectToFormat.ToString();
}

질문이 있으시면

  1. String.Format은 추가 정보 MM / dd / yyyy를 문자열 결과에 어떻게 매핑합니까?

    위에서 지정한대로 IFormattable .ToString (문자열 형식, IFormatProvider 공급자) 만 호출합니다. 공급자는 종종 시스템의 문화가 무엇인지 알려주는 것입니다. 귀하의 경우처럼 사람들이 String.Format ()을 전달하지 않기 때문에 종종 null입니다.

  2. 모든 Microsoft 개체가이 기능을 지원합니까? 어딘가에 문서화되어 있습니까?

    IFormattable을 구현하는 모든 것이 수행됩니다.

  3. 다음과 같이 할 수 있습니까? String.Format("{0:MyCustomFormat}, new MyOwnClass())

    기본적으로 구현 한 형식으로 자신의 개체가 작업을 수행하도록하려면 IFormattable.

형식 문자열이 대체로 유사 하더라도 지원하는 클래스와 열거자가 엄청나게 많습니다 . 여기 더 .


답변

예, 가능합니다. 완전히 사용자 정의 할 수 있습니다. 에서 봐 날짜와 시간을 지정 서식에 문서 링크.

자신의 개체가있는 경우 ToString()메서드 를 재정의 하고 적절한 표현이라고 생각하는 모든 것을 출력하는 것은 사용자 에게 달려 있습니다 . 이렇게하면 String.Format("{0:MyCustomFormat}", new MyOwnClass())암시 적으로 호출 하기 때문에 사용할 수 있습니다.MyOwnClass.ToString()


답변

날짜에 대한 문서는 http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx 에서 찾을 수 있습니다
.

MM과 같은 모든 날짜 형식 문자가 의미하는 바를 정확히 알려줍니다.

사용자 지정 클래스에 대한 문자열이 출력되는 방식을 변경하려면 다음과 같이 ToString 메서드를 재정의 할 수 있습니다.

public class User
{
     public string Name { get; set; }
     public int Age { get; set; }

     public override string ToString()
     {
         return this.Name + " is " + this.Age + " years old.";
     }
}

그런 다음 다음과 같은 작업을 수행하고 myUser.ToString()지정한 출력을 얻을 수 있습니다.


답변

즉,이 구문을 사용 불가능,하지만 당신은의 인스턴스를 제공 할 수 있습니다 그리고 세 번째 질문에 대답 할 수 IFormatProviderICustomFormatter유형에 대해 작성하지 않았거나 구현 IFormattable(즉 기본적으로 확장, 비록 당신의 유형 내에서 ToString).