내보내기(0) 인쇄
모두 확장
이 문서는 기계로 번역한 것입니다. 원본 텍스트를 보려면 포인터를 문서의 문장 위로 올리십시오. 추가 정보
번역
원본

String.Format 메서드

지정된 문자열의 각 형식 항목을 해당 개체의 값에 맞는 텍스트로 바꿉니다.

이 멤버는 오버로드됩니다. 구문, 사용법 및 예제를 비롯하여 이 멤버에 대한 자세한 내용을 보려면 오버로드 목록에서 이름을 클릭합니다.

  이름 설명
Public 메서드 정적 멤버 Format(String, Object) 지정된 문자열에 있는 하나 이상의 형식 항목을 지정된 개체의 문자열 표현으로 바꿉니다.
Public 메서드 정적 멤버 Format(String, Object[]) 지정된 문자열의 형식 항목을 지정된 배열에 있는 해당 개체의 문자열 표현으로 바꿉니다.
Public 메서드 정적 멤버 Format(IFormatProvider, String, Object[]) 지정된 문자열의 형식 항목을 지정된 배열에 있는 해당 개체의 문자열 표현으로 바꿉니다. 매개 변수에서 문화권별 형식 지정 정보를 제공합니다.
Public 메서드 정적 멤버 Format(String, Object, Object) 지정된 문자열에 있는 서식 지정 항목을 지정된 두 개체의 문자열 표현으로 바꿉니다.
Public 메서드 정적 멤버 Format(String, Object, Object, Object) 지정된 문자열의 형식 항목을 지정된 세 개체의 문자열 표현으로 바꿉니다.
위쪽

이 섹션의 내용

오버로드된 메서드 구문
매개 변수
반환 값
예외
어느 메서드를 호출할 수 있습니까?
간단한 형식 메서드
형식 항목
인수 형식을 지정 하는 방법
동일한 인덱스를가지고 있는 형식 항목
서식 및 문화권
사용자 지정 형식 지정 작업
예를 들면 다음과 같습니다.
       단일 인수의 형식
       두개의 인수의 형식
       세 개의 인수 형식
       세 개 이상의 인수 형식
       문화권구분 형식 지정
       사용자 지정 형식 지정 작업
       차단 제공자와 로마 숫자 포맷
버전 정보

오버로드된 메서드 구문

부가적인 지침서에 따라 오버로드를 선택합니다, 더 많은 정보는 어느 메서드를 호출할 수 있습니까?를 참조하십시오.

String String.Format(String format , Object arg0 )

문자열의 형식 항목을 지정된 문자열 표현으로 바꿉니다. (예제).

String String.Format(String format , Object arg0 , Object arg1 )

문자열의 형식 항목을 지정된 두 개의 문자열 표현으로 바꿉니다. (예제).

String String.Format(String format , Object arg0 , Object arg1 , Object arg2 )

문자열의 형식 항목을 지정된 세 개의 문자열 표현으로 바꿉니다. (예제)

String String.Format(String format , params Object[] args )

문자열의 형식 항목을 지정된 배열에 있는 해당 개체의 문자열 표현으로 바꿉니다.(예제)

String String.Format(IFormatProvider provider , String format , params Object[] args )

지정된 배열에서 해당 개체의 문자열 표현으로 서식 항목들이 대체되고, 지정된 문화권 형식 정보(예제) 또는 사용자 지정 형식 정보(예제)를 사용합니다.

매개 변수

이것은 Format 메서드에 대한 전체 매개변수 목록입니다.; 이 매개변수들에 대한 오버로드 구분들은 각 오버로드들을 참조하세요. 오직 format 매개변수만 모든 오버로드들에서 사용됩니다.

Parameter

형식

설명

s

String

하나 또는 그 이상의 형식 항목이 포함된 합성 서식 문자열(형식 항목을 참조).

arg0

String

첫 번째 또는 서식을 지정하는 개체만 있습니다.

arg1

String

형식을 지정할 두 번째 개체입니다.

arg2

String

형식을 지정할 세 번째 개체입니다.

args

String []

0 또는 그 이상의 개체에 서식을 지정하려면 쉼표로 구분된 목록 또는 배열이 제공됩니다.

provider

IFormatProvider

사용자 지정 또는 문화권별 서식 지정 정보를 제공하는 개체입니다.

반환 값

형식: String
형식 항목을 format 에 있는 해당 인수의 문자열 표현으로 바꾼 복사본입니다.

예외

예외

조건

의해 쓰로우 됩니다.

ArgumentNullException

formatnull입니다.

모든 오버 로드

FormatException

format이(가) 잘못되었습니다.

또는

서식 항목의 인덱스가 0보다 작거나 인수의 목록에서 매개변수의 수보다 크거나 같은 경우

모든 오버 로드

어느 메서드를 호출할 수 있습니까?

Call

현재 문화권의 규칙을 사용하여 하나 또는 그 이상의 개체들의 서식을 지정합니다.

provider 매개변수를 포함하는 오버 로드를 제외하고, 모든 Format 오버로드들은 String 매개변수 뒤에 하나 또는 그 보다 많은 개체 매개변수들을 포함합니다. 이 때문에, 호출을 하기 위해 Format 오버로드를 결정할 필요가 없습니다. 언어 컴파일러는 매개변수 목록을 기반하여, provider 인수를 사용하지 않는 오버 로드 중에서 적절한 오버로드를 선택합니다. 예를 들어, 만일 인수목록이 다섯개의 인수를 갖는 경우, 컴파일러는 Format(String, Object[]) 메서드를 호출합니다.

특정 문화권의 규칙을 사용하여 하나 또는 그 이상의 개체들의 서식을 지정합니다.

Format(IFormatProvider, String, Object[])

ICustomFormatter 구현 또는 IFormattable 구현들 중 하나와 사용자 지정 작업을 수행합니다.

Format(IFormatProvider, String, Object[])

간단한 형식 메서드

Format 메서드의 각 오버로드는 합성 형식 지정 기능을 사용하여 합성 형식 문자열로 형식 항목이라고 하는 1부터 시작하는 인덱싱된 자리 표시자를 포함합니다. 런타임에 각 형식 항목은 매개 변수 목록에 있는 해당 인수의 문자열 표현으로 바뀝니다. 인수의 값이 null 이면, String.Empty 로 서식항목이 대체됩니다. 예를 들어, Format(String, Object, Object, Object) 메서드에 대한 다음 호출은 {0}, {1} 및 {2}의 세 가지 형식 항목이 있는 형식 문자열과 세 항목을 가진 인수 목록을 포함합니다.


DateTime dat = new DateTime(2012, 1, 17, 9, 30, 0); 
string city = "Chicago";
int temp = -16;
string output = String.Format("At {0} in {1}, the temperature was {2} degrees.",
                              dat, city, temp);
Console.WriteLine(output);
// The example displays the following output:
//    At 1/17/2012 9:30:00 AM in Chicago, the temperature was -16 degrees.   


형식 항목

형식 항목은 이 구문을 갖습니다:

{ index[,alignment][ :formatString] }

대괄호는 선택적 요소를 나타냅니다. 열고 닫는 중괄호들이 필요합니다. (형식 문자열에서 문자 여는 또는 닫는 중괄호를 포함하기 위해 합성 형식 지정 기사에서 "벗어나는 중괄호" 절을 참조하세요.)

예를 들어, 통화 값 형식에 대한 형식 항목은 다음과 같이 나타납니다.


String.Format("{0,-10:C}", 126347.89m);         


형식 항목에는 다음과 같은 요소가 있습니다.

인덱스입니다.

문자열 표현이 문자열의 이 위치에 포함되는 인수의 인덱스(0부터 시작)입니다. 이 인수가 null 이면, 문자열에서 이 위치에 빈 문자열이 포함됩니다.

맞춤

선택적 요소로서, 인수가 삽입되는 필드의 총 길이와 오른쪽 맞춤(양의 정수) 또는 왼쪽 맞춤(음의 정수) 인지 여부를 나타내는 부호 있는 정수입니다. 만일 맞춤 을 생락하는 경우, 해당 인수의 문자열 표현은 선행 또는 후행 공백이 없는 필드에 삽입됩니다.

:형식 문자열

선택적 요소로서, 해당 인수의 결과 문자열의 형식을 지정 하는 문자열입니다. 만일 형식 문자열을 생략하면, 해당 인수의 매개 변수 없는 ToString 메서드가 문자열 표현을 만들기 위해 호출됩니다. 형식 문자열을 지정하면, 형식 항목으로 참조되는 인수는 IFormattable 인터페이스를 구현해야합니다. 형식 문자열을 지원하는 형식은 다음과 같습니다.

그러나, 모든 사용자 지정 형식은 IFormattable 구현할 수 있고 기존 형식의 IFormattable 구현을 확장할 수 있습니다.

다음 예제는 형식이 지정된 출력을 생성하기 위해 alignmentformatString 인수를 사용합니다.


using System;

public class Example
{
   public static void Main()
   {
      // Create array of 5-tuples with population data for three U.S. cities, 1940-1950.
      Tuple<string, DateTime, int, DateTime, int>[] cities = 
          { Tuple.Create("Los Angeles", new DateTime(1940, 1, 1), 1504277, 
                         new DateTime(1950, 1, 1), 1970358),
            Tuple.Create("New York", new DateTime(1940, 1, 1), 7454995, 
                         new DateTime(1950, 1, 1), 7891957),  
            Tuple.Create("Chicago", new DateTime(1940, 1, 1), 3396808, 
                         new DateTime(1950, 1, 1), 3620962),  
            Tuple.Create("Detroit", new DateTime(1940, 1, 1), 1623452, 
                         new DateTime(1950, 1, 1), 1849568) };

      // Display header
      string header = String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n",
                                    "City", "Year", "Population", "Change (%)");
      Console.WriteLine(header);
      string output;      
      foreach (var city in cities) {
         output = String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}",
                                city.Item1, city.Item2, city.Item3, city.Item4, city.Item5,
                                (city.Item5 - city.Item3)/ (double)city.Item3);
         Console.WriteLine(output);
      }
   }
}
// The example displays the following output:
//    City            Year  Population    Year  Population    Change (%)
//    
//    Los Angeles     1940   1,504,277    1950   1,970,358        31.0 %
//    New York        1940   7,454,995    1950   7,891,957         5.9 %
//    Chicago         1940   3,396,808    1950   3,620,962         6.6 %
//    Detroit         1940   1,623,452    1950   1,849,568        13.9 %


인수 형식을 지정 하는 방법

항목 형식은 문자열의 처음부터 순차적으로 처리 됩니다. 각 형식 항목은 메서드의 인수 목록의 개체에 해당하는 인덱스를 가집니다. Format 메서드는 인수를 검색하고 다음처럼 문자열 표현을 파생합니다:

  • 인수가 null 이라면, 메서드는 결과 문자열로 String.Empty 를 삽입합니다.

  • 만일 Format(IFormatProvider, String, Object[]) 오버로드를 호출하고 provider 매개변수가 ICustomFormatter 인터페이스를 구현하는 경우, 인수는 provider 개체의 ICustomFormatter.Format(String, Object, IFormatProvider) 메서드로 전달됩니다. 형식 항목이 형식 문자열 을 포함하는 경우, 메서드의 첫번째 인수로써 전달됩니다. 만일 ICustomFormatter 구현이 형식 지정 서비스를 제공할 수 있는 경우, 인수의 문자열 표현을 반환합니다; 그렇지 않으면 null 을 반환하고 다음 단계를 실행합니다.

  • 인수가 IFormattable 인터페이스를 구현하면 해당 IFormattable.ToString 구현이 호출됩니다.

  • 인수의 매개변수 없는 ToString 메서드가 호출됩니다. 이 메서드는 Object 클래스에서 재정의 또는 상속됩니다.

ICustomFormatter.Format 메서드에서 호출을 가로채고 합성 형식 문자열에서 각 형식 항목으로 전달하는 Format 의 정보를 보는 예제는, 예제 7: 가로채기 공급자와 로마 숫자 형식지정을 참고하세요.

동일한 인덱스를가지고 있는 형식 항목

Format 메서드는 인덱스 항목의 인덱스가 인수목록에서 인수의 수보다 크거나 동일한 경우 FormatException 예외를 출력합니다. 그러나, format 은 여러 형식 항목들이 같은 인덱스를 갖기 때문에, 존재하는 인수들보다 많은 형식 항목들을 포함할 수 있습니다. 다음 예제의 Format(String, Object) 메서드를 호출하는 것에서 인수 목록이 단일한 인수들을 갖지만, 형식 문자열은 두 형식 항목들을 포함합니다: 10진수 숫자를 표시하는 것, 16진수 숫자를 표시하는 것.


public class Example
{
   public static void Main()
   {
      short[] values= { Int16.MinValue, -27, 0, 1042, Int16.MaxValue };
      Console.WriteLine("{0,10}  {1,10}\n", "Decimal", "Hex");
      foreach (short value in values)
      {
         string formatString = String.Format("{0,10:G}: {0,10:X}", value);
         Console.WriteLine(formatString);
      }   
   }
}
// The example displays the following output:
//       Decimal         Hex
//    
//        -32768:       8000
//           -27:       FFE5
//             0:          0
//          1042:        412
//         32767:       7FFF


서식 및 문화권

일반적으로, 인수목록에서 개체들은 현재 문화권의 규칙을 사용하여 문자열 표현으로 변환되고, 이것은 CultureInfo.CurrentCulture 속성으로 반환됩니다. Format(IFormatProvider, String, Object[]) 오버로드를 호출하여 이 동작을 컨트롤 할 수 있습니다. 이 오버로드의 provider 매개변수는 서식 지정 프로세스에 보통 사용되는 사용자 지정과 문화권별 서식 지정 정보를 제공하는 IFormatProvider 구현입니다.

IFormatProvider 인터페이스는 형식 지정 정보를 제공하는 개체를 반환히기 위한 GetFormat 단일 멤버를 가집니다. .NET Framework 는 문화권별 형식을 제공하는 세개의 IFormatProvider 를 가집니다.

사용자 지정 형식 지정 작업

사용자 지정 서식 작업을 수행하기 위해 Format(IFormatProvider, String, Object[]) 오버로드 역시 호출할 수 있습니다. 예를 들어, id 번호 또는 전화 번호를 정수 서식으로 지정할 수 있습니다. 사용자 지정 형식 지정을 수행하기 위해, provider 인수는 IFormatProviderICustomFormatter 인터페이스 모두를 구현해야합니다. Format(IFormatProvider, String, Object[]) 메서드가 provider 인수로 ICustomFormatter 에 전달될 때, Format 메서드는 해당 IFormatProvider.GetFormat 구현을 호출하고 ICustomFormatter형식의 개체를 요청합니다.. 그런 다음 이것으로 전달된 합성 문자열에서 각 형식 항목을 지정하기 위해, 반환된 ICustomFormatter 개체의 Format 메서드를 호출합니다.

사용자 지정 형식 지정 솔루션을 제공에 관한 자세한 내용은, 방법: 사용자 지정 숫자 형식 공급자 정의 및 사용ICustomFormatter를 참조하세요. 지정된 사용자 지정 숫자로 정수를 변환하는 예제에 대한 정보는 예제 6: 사용자 지정 작업 을 참고하세요. 부호 없는 바이트를 로마 숫자로 변환하는 예제를 보려면, 예제 7: 가로채기 공급자 및 로마 숫자 구성방식을 참조하세요.

예제 1: 단일 인수 형식

다음 예제에서는 Format(String, Object) 메서드를 사용하여 문자열에 각 사용자의 사용 기간을 포함합니다.


using System;

[assembly: CLSCompliant(true)]
public class Example
{
   public static void Main()
   {
      DateTime birthdate = new DateTime(1993, 7, 28);
      DateTime[] dates = { new DateTime(1993, 8, 16), 
                           new DateTime(1994, 7, 28), 
                           new DateTime(2000, 10, 16), 
                           new DateTime(2003, 7, 27), 
                           new DateTime(2007, 5, 27) };

      foreach (DateTime dateValue in dates)
      {
         TimeSpan interval = dateValue - birthdate;
         // Get the approximate number of years, without accounting for leap years.
         int years = ((int) interval.TotalDays) / 365;
         // See if adding the number of years exceeds dateValue.
         string output;
         if (birthdate.AddYears(years) <= dateValue) {
            output = String.Format("You are now {0} years old.", years);
            Console.WriteLine(output);
         }   
         else {
            output = String.Format("You are now {0} years old.", years - 1);
            Console.WriteLine(output);
         }      
      }
   }
}
// The example displays the following output:
//       You are now 0 years old.
//       You are now 1 years old.
//       You are now 7 years old.
//       You are now 9 years old.
//       You are now 13 years old.


예제 2: 두 개의 인수 형식

예제에서는 Format(String, Object, Object) 메서드를 사용하여 제네릭 Dictionary<TKey, TValue> 개체에 저장된 시간 및 온도 데이터를 표시합니다. 형식 문자열에 세 개의 형식 항목이 있지만 형식을 지정할 항목은 두 개만 있습니다. 이것은 목록에서(날짜와 시간 값) 첫번째 개체가 두 형식 항목에 의해 사용 되기 때문입니다: 첫 번째는 시간을 표시하는 형식 항목, 두 번째 날짜를 표시 합니다.


using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      Dictionary<DateTime, Double> temperatureInfo = new Dictionary<DateTime, Double>(); 
      temperatureInfo.Add(new DateTime(2010, 6, 1, 14, 0, 0), 87.46);
      temperatureInfo.Add(new DateTime(2010, 12, 1, 10, 0, 0), 36.81);

      Console.WriteLine("Temperature Information:\n");
      string output;   
      foreach (var item in temperatureInfo)
      {
         output = String.Format("Temperature at {0,8:t} on {0,9:d}: {1,5:N1}°F", 
                                item.Key, item.Value);
         Console.WriteLine(output);
      }
   }
}
// The example displays the following output:
//       Temperature Information:
//       
//       Temperature at  2:00 PM on  6/1/2010:  87.5°F
//       Temperature at 10:00 AM on 12/1/2010:  36.8°F


예제 3: 세 개의 인수 형식

예제에서는 Format(String, Object, Object, Object) 메서드를 사용하여 두 개의 정수 값으로 부울 And 작업의 결과를 나타내는 문자열을 만듭니다. 형식 문자열에 여섯 가지 형식 항목이 포함되어 있지만 각 항목이 두 가지 다른 방식으로 서식이 지정되기 때문에 메서드의 매개 변수 목록에는 세 가지 항목만 있습니다.


using System;

public class Example
{
   public static void Main()
   {
      string formatString = "    {0,10} ({0,8:X8})\n" + 
                            "And {1,10} ({1,8:X8})\n" + 
                            "  = {2,10} ({2,8:X8})";
      int value1 = 16932;
      int value2 = 15421;
      string result = String.Format(formatString, 
                                    value1, value2, value1 & value2);
      Console.WriteLine(result);
   }
}
// The example displays the following output:
//                16932 (00004224)
//       And      15421 (00003C3D)
//         =         36 (00000024)


예제 4: 세 개 이상의 인수 형식

예제에서는 특정 날짜의 최고 온도와 최저 온도에 대한 데이터가 들어 있는 문자열을 만듭니다. 합성 서식 문자열에는 C# 예제에서는 5개, Visual Basic 예제에서는 6개의 형식 항목이 있습니다. 두 가지 형식 항목은 해당하는 값의 문자열 표현의 너비를 정의하며 첫 번째 형식 항목은 표준 날짜 및 시간 형식 문자열도 포함합니다.


using System;

public class Example
{
   public static void Main()
   {
      DateTime date1 = new DateTime(2009, 7, 1);
      TimeSpan hiTime = new TimeSpan(14, 17, 32);
      decimal hiTemp = 62.1m; 
      TimeSpan loTime = new TimeSpan(3, 16, 10);
      decimal loTemp = 54.8m; 

      string result1 = String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                                     date1, hiTime, hiTemp, loTime, loTemp);
      Console.WriteLine(result1);
      Console.WriteLine();

      string result2 = String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                                     new object[] { date1, hiTime, hiTemp, loTime, loTemp });
      Console.WriteLine(result2);
   }
}
// The example displays the following output:
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)


인수 목록 대신 배열 형식으로 지정되기 위해 개체를 전달할 수도 있습니다.


using System;

public class CityInfo
{
   public CityInfo(String name, int population, Decimal area, int year)
   {
      this.Name = name;
      this.Population = population;
      this.Area = area;
      this.Year = year;
   }

   public readonly String Name; 
   public readonly int Population;
   public readonly Decimal Area;
   public readonly int Year;
}

public class Example
{
   public static void Main()
   {
      CityInfo nyc2010 = new CityInfo("New York", 8175133, 302.64m, 2010);
      ShowPopulationData(nyc2010);
      CityInfo sea2010 = new CityInfo("Seattle", 608660, 83.94m, 2010);      
      ShowPopulationData(sea2010); 
   }

   private static void ShowPopulationData(CityInfo city)
   {
      object[] args = { city.Name, city.Year, city.Population, city.Area };
      String result = String.Format("{0} in {1}: Population {2:N0}, Area {3:N1} sq. feet", 
                                    args);
      Console.WriteLine(result); 
   }
}
// The example displays the following output:
//       New York in 2010: Population 8,175,133, Area 302.6 sq. feet
//       Seattle in 2010: Population 608,660, Area 83.9 sq. feet


예제 5: 문화권별 서식

예제에서는 Format(IFormatProvider, String, Object[]) 메서드를 사용하여 일부 날짜 및 시간 값과 숫자 값의 문자열 표현을 여러 다른 문화권에 맞게 표시합니다.


using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      string[] cultureNames = { "en-US", "fr-FR", "de-DE", "es-ES" };

      DateTime dateToDisplay = new DateTime(2009, 9, 1, 18, 32, 0);
      double value = 9164.32;

      Console.WriteLine("Culture     Date                                Value\n");
      foreach (string cultureName in cultureNames)
      {
         CultureInfo culture = new CultureInfo(cultureName);
         string output = String.Format(culture, "{0,-11} {1,-35:D} {2:N}", 
                                       culture.Name, dateToDisplay, value);
         Console.WriteLine(output);
      }    
   }
}
// The example displays the following output:
//    Culture     Date                                Value
//    
//    en-US       Tuesday, September 01, 2009         9,164.32
//    fr-FR       mardi 1 septembre 2009              9 164,32
//    de-DE       Dienstag, 1. September 2009         9.164,32
//    es-ES       martes, 01 de septiembre de 2009    9.164,32


예제 6: 사용자 지정 작업

예제에서는 정수 값의 형식을 x-xxxxx-xx 형태의 고객 계정 번호로 지정하는 형식 공급자를 정의합니다.


using System;

public class TestFormatter
{
   public static void Main()
   {
      int acctNumber = 79203159;
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:G}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:S}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:P}", acctNumber));
      try {
         Console.WriteLine(String.Format(new CustomerFormatter(), "{0:X}", acctNumber));
      }
      catch (FormatException e) {
         Console.WriteLine(e.Message);
      }
   }
}

public class CustomerFormatter : IFormatProvider, ICustomFormatter
{
   public object GetFormat(Type formatType) 
   {
      if (formatType == typeof(ICustomFormatter))        
         return this; 
      else
         return null;
   }

   public string Format(string format, 
	                     object arg, 
	                     IFormatProvider formatProvider) 
   {                       
      if (! this.Equals(formatProvider))
      {
         return null;
      }
      else
      {
         if (String.IsNullOrEmpty(format)) 
            format = "G";

         string customerString = arg.ToString();
         if (customerString.Length < 8)
            customerString = customerString.PadLeft(8, '0');

         format = format.ToUpper();
         switch (format)
         {
            case "G":
               return customerString.Substring(0, 1) + "-" +
                                     customerString.Substring(1, 5) + "-" +
                                     customerString.Substring(6);
            case "S":                          
               return customerString.Substring(0, 1) + "/" +
                                     customerString.Substring(1, 5) + "/" +
                                     customerString.Substring(6);
            case "P":                          
               return customerString.Substring(0, 1) + "." +
                                     customerString.Substring(1, 5) + "." +
                                     customerString.Substring(6);
            default:
               throw new FormatException( 
                         String.Format("The '{0}' format specifier is not supported.", format));
         }
      }   
   }
}
// The example displays the following output:
//       7-92031-59
//       7-92031-59
//       7/92031/59
//       7.92031.59
//       The 'X' format specifier is not supported.


예제 7: 한 가로채기 공급자 및 로마 숫자 구성방식

이 예제는 두가지 작업을 하기 위해 IFormatProvider 인터페이스와 ICustomFormatter 를 구현하는 사용자 지정 형식 공급자를 지정합니다.

  • 이것은 이것의 ICustomFormatter.Format 구현으로 전달되는 매개변수들을 표시합니다. 이것은 형식에 대한 각 개체들의 사용자 지정 형식 구현을 전달하는 Format(IFormatProvider, String, Object[]) 메서드의 매개변수가 무엇인지 볼 수 있도록 활성화합니다. 응용 프로그램을 디버깅할 때 유용할 수 있습니다.

  • 형식이 지정된 개체가 표준 서식 문자열 "R"을 사용하여 지정되는 부호 없는 바이트 값인 경우, 사용자 지정 구성방식은 로마 숫자로 숫자 값 서식을 지정합니다.


using System;
using System.Globalization;

public class InterceptProvider : IFormatProvider, ICustomFormatter
{
   public object GetFormat(Type formatType)
   {
      if (formatType == typeof(ICustomFormatter))
         return this;
      else
         return null;
   }

   public string Format(String format, Object obj, IFormatProvider provider) 
   {
      // Display information about method call.
      string formatString = format ?? "<null>";
      Console.WriteLine("Provider: {0}, Object: {1}, Format String: {2}",
                        provider, obj ?? "<null>", formatString);

      if (obj == null) return String.Empty;

      // If this is a byte and the "R" format string, format it with Roman numerals.
      if (obj is Byte && formatString.ToUpper().Equals("R")) {
         Byte value = (Byte) obj;
         int remainder;
         int result;
         String returnString = String.Empty;

         // Get the hundreds digit(s)
         result = Math.DivRem(value, 100, out remainder);
         if (result > 0)  
            returnString = new String('C', result);
         value = (Byte) remainder;
         // Get the 50s digit
         result = Math.DivRem(value, 50, out remainder);
         if (result == 1)
            returnString += "L";
         value = (Byte) remainder;
         // Get the tens digit.
         result = Math.DivRem(value, 10, out remainder);
         if (result > 0)
            returnString += new String('X', result);
         value = (Byte) remainder; 
         // Get the fives digit.
         result = Math.DivRem(value, 5, out remainder);
         if (result > 0)
            returnString += "V";
         value = (Byte) remainder;
         // Add the ones digit.
         if (remainder > 0) 
            returnString += new String('I', remainder);

         // Check whether we have too many X characters.
         int pos = returnString.IndexOf("XXXX");
         if (pos >= 0) {
            int xPos = returnString.IndexOf("L"); 
            if (xPos >= 0 & xPos == pos - 1)
               returnString = returnString.Replace("LXXXX", "XC");
            else
               returnString = returnString.Replace("XXXX", "XL");   
         }
         // Check whether we have too many I characters
         pos = returnString.IndexOf("IIII");
         if (pos >= 0)
            if (returnString.IndexOf("V") >= 0)
               returnString = returnString.Replace("VIIII", "IX");
            else
               returnString = returnString.Replace("IIII", "IV");    

         return returnString; 
      }   

      // Use default for all other formatting.
      if (obj is IFormattable)
         return ((IFormattable) obj).ToString(format, CultureInfo.CurrentCulture);
      else
         return obj.ToString();
   }
}

public class Example
{
   public static void Main()
   {
      int n = 10;
      double value = 16.935;
      DateTime day = DateTime.Now;
      InterceptProvider provider = new InterceptProvider();
      Console.WriteLine(String.Format(provider, "{0:N0}: {1:C2} on {2:d}\n", n, value, day));
      Console.WriteLine(String.Format(provider, "{0}: {1:F}\n", "Today: ", 
                                      (DayOfWeek) DateTime.Now.DayOfWeek));
      Console.WriteLine(String.Format(provider, "{0:X}, {1}, {2}\n", 
                                      (Byte) 2, (Byte) 12, (Byte) 199));
      Console.WriteLine(String.Format(provider, "{0:R}, {1:R}, {2:R}\n", 
                                      (Byte) 2, (Byte) 12, (Byte) 199));
   }
}
// The example displays the following output:
//    Provider: InterceptProvider, Object: 10, Format String: N0
//    Provider: InterceptProvider, Object: 16.935, Format String: C2
//    Provider: InterceptProvider, Object: 1/31/2013 6:10:28 PM, Format String: d
//    10: $16.94 on 1/31/2013
//    
//    Provider: InterceptProvider, Object: Today: , Format String: <null>
//    Provider: InterceptProvider, Object: Thursday, Format String: F
//    Today: : Thursday
//    
//    Provider: InterceptProvider, Object: 2, Format String: X
//    Provider: InterceptProvider, Object: 12, Format String: <null>
//    Provider: InterceptProvider, Object: 199, Format String: <null>
//    2, 12, 199
//    
//    Provider: InterceptProvider, Object: 2, Format String: R
//    Provider: InterceptProvider, Object: 12, Format String: R
//    Provider: InterceptProvider, Object: 199, Format String: R
//    II, XII, CXCIX


버전 정보

.NET Framework

모든 오버로드는 지원됩니다: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

모든 오버로드는 지원됩니다: 4, 3.5 SP1

이식 가능한 클래스 라이브러리

오직 Format(String, Object[])Format(IFormatProvider, String, Object[]) 에 지원됩니다.

Windows 스토어 앱용 .NET

Windows8에서 오직 Format(String, Object[])Format(IFormatProvider, String, Object[]) 이 지원됩니다.

커뮤니티 추가 항목

추가
표시:
© 2015 Microsoft