it-swarm.dev

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())
77
hwcverwe

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도 사용할 수 있습니다. 예 herehere .

그래서 당신의 질문에 대한 답은 순서대로 :

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

  2. IFormattable을 구현하는 모든 객체는이 기능을 지원합니다. 당신은 자신의 것을 쓸 수도 있습니다!

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

84
yamen

내 이해에서 이것을 지원하려면 클래스에서 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())
18
Dean Thomas
  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 . 그것은 매우 간단합니다. 제공 된 문자열을 확인하고이를 기반으로 데이터를 작성하면 장면 뒤에 마술이 없습니다 :-)

4
Steve Haigh

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

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

당신의 질문에 대해

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

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

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

    IFormattable을 구현하는 것은 무엇이든합니다.

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

    본질적으로 자신의 객체가 제공된 형식으로 무언가를 수행하려면 IFormattable 를 구현하십시오.

형식 문자열이 largely와 비슷하도록 보장하기 위해 수많은 지원 클래스 및 열거자가 있습니다. 더보기 .

3
M Afifi

그렇습니다, 가능합니다-그것은 완전히 주문을 받아서 만들어 질 수 있습니다. 날짜 및 시간 사용자 정의 형식에 대한 this 문서 링크를보십시오.

자신의 객체를 가지고 있다면 ToString() 메소드를 재정의하고 적절한 표현이라고 생각하는 것을 출력해야합니다. String.Format("{0:MyCustomFormat}", new MyOwnClass())을 암시 적으로 호출하기 때문에 MyOwnClass.ToString()을 사용할 수 있습니다.

0
Maciej

날짜에 대한 설명서는 여기에서 찾을 수 있습니다. 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 확장됩니다).

0
phg