IT TIP

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

itqueen 2020. 10. 14. 21:33
반응형

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.

There are a huge number of supporting classes and enumerators to ensure though that format strings are largely similar. More here.


Yes, it is possible - it can be completely customized. Look at this documentation link on date and time custom formatting.

If you have your own object it is up to you to override ToString() method and output whatever you think is appropriate representation. Once you do this you can use String.Format("{0:MyCustomFormat}", new MyOwnClass()) because this implicitly calls MyOwnClass.ToString()


The documentation for dates can be found here: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

That should tell you exactly what all of the date formatting characters like MM mean.

If you want to change how a string is output for a custom class, you can override the ToString method, like this:

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.";
     }
}

and then you can just do something like myUser.ToString() and get the output you specified.


And to answer your third question: That's not possible with this syntax, but you can provide instances of IFormatProvider and ICustomFormatter for a type you didn't create, or implement IFormattable inside your type (although, that basically extends ToString).

참고URL : https://stackoverflow.com/questions/10512349/string-format-how-it-works-and-how-to-implement-custom-formatstrings

반응형