으로 String.Format()
는, 예를 들어 포맷 할 수 있습니다 DateTime
다양한 방법으로 객체. 원하는 형식을 찾을 때마다 인터넷에서 검색해야합니다. 거의 항상 사용할 수있는 예를 찾습니다. 예를 들면 :
String.Format("{0:MM/dd/yyyy}", DateTime.Now); // "09/05/2012"
그러나 나는 그것이 어떻게 작동하는지, 어떤 클래스가 이러한 ‘마법’추가 문자열을 지원하는지 전혀 알지 못합니다.
그래서 내 질문은 다음과 같습니다.
String.Format
추가 정보MM/dd/yyyy
를 문자열 결과에 어떻게 매핑 합니까?- 모든 Microsoft 개체가이 기능을 지원합니까?
어딘가에 문서화되어 있습니까? - 다음과 같이 할 수 있습니까?
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
또한 등의 예를 기본 포맷 표준 / 기본값을 캡처하는 데 사용할 수있는 사용 할 수 있습니다 여기 와 여기 .
따라서 질문에 대한 답변은 다음과 같습니다.
-
개체 에 대한
IFormattable
인터페이스의ToString()
메서드를 사용하고 형식 문자열을DateTime
전달MM/dd/yyyy
합니다. 올바른 문자열을 반환하는 구현입니다. -
구현
IFormattable
하는 모든 개체 는이 기능을 지원합니다. 직접 작성할 수도 있습니다! -
예, 위를 참조하십시오.
답변
내 이해에서이를 지원하려면 클래스에서 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())
답변
-
공식 MSDN 문서를 확인하십시오. DateTime 형식 문자열의 전체 목록은 http://msdn.microsoft.com/en-us/library/az4se3k1.aspx 입니다. 실제로 꽤 많은 “마법”문자열이 있습니다.
-
내가 아는 한 모든 유형에 “흥미로운”형식이있는 것은 아니지만 모든 유형이
ToString()
. 내장 된 개체의 형식을 지정해야하는 경우 확장 메서드를 추가하여 수행 할 수 있지만 일반적으로 형식이 필요한 곳이면 어디에서나 제공됩니다 (또는 다른 방식으로 표현하기 위해 고유 한 형식에 대한 사용자 지정 형식 지정자 만 작성했습니다). . -
예, 직접 작성할 수 있으며 다른 방식으로 서식을 지정할 수있는 데이터가있는 경우 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();
}
질문이 있으시면
-
String.Format은 추가 정보 MM / dd / yyyy를 문자열 결과에 어떻게 매핑합니까?
위에서 지정한대로 IFormattable .ToString (문자열 형식, IFormatProvider 공급자) 만 호출합니다. 공급자는 종종 시스템의 문화가 무엇인지 알려주는 것입니다. 귀하의 경우처럼 사람들이 String.Format ()을 전달하지 않기 때문에 종종 null입니다.
-
모든 Microsoft 개체가이 기능을 지원합니까? 어딘가에 문서화되어 있습니까?
IFormattable을 구현하는 모든 것이 수행됩니다.
-
다음과 같이 할 수 있습니까?
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()
지정한 출력을 얻을 수 있습니다.
답변
즉,이 구문을 사용 불가능,하지만 당신은의 인스턴스를 제공 할 수 있습니다 그리고 세 번째 질문에 대답 할 수 IFormatProvider
및 ICustomFormatter
유형에 대해 작성하지 않았거나 구현 IFormattable
(즉 기본적으로 확장, 비록 당신의 유형 내에서 ToString
).