본문 바로가기

[Proramming]/C#

데이터를 지정된 형태의 포멧으로 Text Box에 출력하기

데이터를 지정된 형태의 포멧으로 Text Box에 출력하기
.Net으로 가면서 많이 바뀌었군... VC++, VB 동일하게 사용할 수 있다.


   System::String^ str;
   System::String^ strData;
   for(int i=0;i<64;i++)
   {
    if((i>0)&&(i%10 == 0))strData += "\r\n";
 
    strData += str->Format("{0,2:X} ", Buffer[i]);
   
   }
   textBox1->Text = strData;


합성 형식 지정

업데이트: 2007년 11월

.NET Framework의 합성 형식 지정 기능에는 개체 목록과 합성 형식 문자열이 입력으로 사용됩니다. 합성 형식 문자열은 고정 텍스트와 목록의 개체에 해당하는 인덱싱된 자리 표시자(형식 항목이라고 함)가 결합된 형태로 구성됩니다. 형식 지정 작업을 통해 원래의 고정 텍스트와 목록에 있는 개체의 문자열 표현이 결합된 형태의 결과 문자열을 얻을 수 있습니다.

합성 형식 지정 기능은 FormatAppendFormat과 같은 메서드와 WriteLineTextWriter..::.WriteLine의 일부 오버로드를 통해 사용할 수 있습니다. String..::.Format 메서드는 형식이 지정된 결과 문자열을 생성하고, AppendFormat 메서드는 StringBuilder 개체에 형식이 지정된 결과 문자열을 추가하고, Console..::.WriteLine 메서드는 형식이 지정된 결과 문자열을 콘솔에 표시하며, TextWriter..::.WriteLine 메서드는 형식이 지정된 결과 문자열을 스트림이나 파일에 씁니다.

합성 형식 문자열과 개체 목록은 합성 형식 지정 기능을 지원하는 메서드의 인수로 사용됩니다. 합성 형식 문자열은 0개 이상의 고정 텍스트가 하나 이상의 형식 항목과 결합된 형태로 구성됩니다. 고정 텍스트는 사용자가 선택하는 임의의 문자열이고, 각 형식 항목은 목록의 개체나 boxed 구조체에 해당합니다. 합성 형식 지정 기능은 각 형식 항목을 목록에 있는 해당 개체의 문자열 표현으로 바꿔 새로운 결과 문자열을 반환합니다.

다음은 이 기능을 보여 주는 Format 코드 조각입니다.

Visual Basic
Dim myName As String = "Fred"
String.Format("Name = {0}, hours = {1:hh}", myName, DateTime.Now)
string myName = "Fred";
String.Format("Name = {0}, hours = {1:hh}", myName, DateTime.Now);

고정 텍스트는 "Name = " 및 ", hours = "입니다. 형식 항목은 인덱스가 0이고 myName 개체에 해당하는 "{0}"과 인덱스가 1이고 DateTime.Now 개체에 해당하는 "{1:hh}"입니다.

각 형식 항목의 형태와 구성 요소는 다음과 같습니다.

{index[,alignment][:formatString]}

여기서 중괄호("{"와 "}")의 짝이 반드시 맞아야 합니다.

Index 구성 요소

매개 변수 지정자라고도 하는 필수 index 구성 요소는 0부터 시작하는 숫자로서, 개체 목록에서 해당하는 항목을 식별합니다. 즉, 매개 변수 지정자가 0인 형식 항목은 목록에 있는 첫 번째 개체의 형식을 지정하고 매개 변수 지정자가 1인 형식 항목은 목록에 있는 두 번째 개체의 형식을 지정하는 식으로 적용됩니다.

동일한 매개 변수 지정자를 지정하여 여러 형식 항목이 개체 목록의 동일한 요소를 참조하도록 할 수 있습니다. 예를 들어, 합성 형식 문자열을 "{0:X} {0:E} {0:N}"과 같이 지정하여 동일한 숫자 값을 16진수, 지수 및 숫자 형식으로 지정할 수 있습니다.

각 형식 항목은 목록의 어떤 개체나 참조할 수 있습니다. 예를 들어, 세 개의 개체가 있을 경우 "{1} {0} {2}"와 같이 복합 형식 문자열을 지정하여 두 번째, 첫 번째 및 세 번째 개체의 형식을 지정할 수 있습니다. 형식 항목에서 참조하지 않는 개체는 무시됩니다. 매개 변수 지정자가 개체 목록 범위를 벗어나는 항목을 지정하면 런타임 예외가 발생합니다.

Alignment 구성 요소

선택적인 alignment 구성 요소는 기본 형식의 필드 너비를 나타내는 부호 있는 정수입니다. alignment 값이 형식이 지정된 문자열보다 작으면 alignment는 무시되고 형식이 지정된 문자열의 길이가 필드 너비로 사용됩니다. alignment가 양수이면 필드에서 형식이 지정된 데이터가 오른쪽 맞춤되고 음수이면 왼쪽 맞춤됩니다. 채우기가 필요하면 공백이 사용됩니다. alignment가 지정되면 쉼표를 사용해야 합니다.

Format String 구성 요소

선택적 formatString 구성 요소는 형식을 지정할 개체 형식에 적절한 형식 문자열입니다. 해당 개체가 숫자 값이면 숫자 형식 문자열을, DateTime이면 날짜 및 시간 형식 문자열을, 열거형 값이면 열거형 형식 문자열을 지정합니다. formatString을 지정하지 않으면 숫자, 날짜 및 시간, 또는 열거형 형식에 대해 일반("G") 형식 지정자가 사용됩니다. formatString을 지정하는 경우에는 콜론이 필요합니다.

이스케이프 중괄호

여는 중괄호와 닫는 중괄호는 형식 항목의 시작과 끝으로 해석됩니다. 따라서 리터럴 여는 중괄호나 닫는 중괄호를 표시하려면 이스케이프 시퀀스를 사용해야 합니다. 고정 텍스트에서 여는 중괄호 2개("{{")를 사용하면 여는 중괄호 1개("{")가, 닫는 중괄호 2개("}}") 를 사용하면 닫는 중괄호 1개("}")가 표시됩니다. 형식 항목에서 중괄호는 나타나는 순서대로 해석됩니다. 중첩 중괄호 해석은 지원되지 않습니다.

이스케이프된 중괄호가 해석되는 방식에 따라 예기치 않은 결과가 나올 수도 있습니다. 예를 들어, 형식 항목 "{{{0:D}}}"는 여는 중괄호, 10진수 형식의 숫자 값 그리고 닫는 중괄호를 나타내려고 했습니다. 그러나 이 형식 항목은 다음과 같이 해석됩니다.

  1. 맨 처음 여는 중괄호 2개("{{")는 이스케이프되어 여는 중괄호 1개가 됩니다.

  2. 그 다음 3개의 문자("{0:")는 형식 항목의 시작으로 해석됩니다.

  3. 다음 문자("D")는 10진 표준 숫자 형식 지정자로 해석되지만, 그 다음 이스케이프된 중괄호 2개("}}")는 중괄호 1개로 인식됩니다. 결과 문자열("D}")은 표준 숫자 형식 지정자가 아니므로 리터럴 문자열 "D}"를 표시하는 사용자 지정 형식 문자열로 해석됩니다.

  4. 마지막 중괄호("}")는 형식 항목의 끝으로 해석됩니다.

  5. 표시되는 최종 결과는 리터럴 문자열 "{D}"입니다. 형식 지정 시 의도했던 숫자 값이 표시되지 않습니다.

이스케이프된 중괄호 및 형식 항목이 잘못 해석되지 않도록 코드를 작성하는 방법 중 하나는 중괄호와 형식 항목의 형식을 따로 지정하는 것입니다. 즉, 첫 번째 형식 작업에서 리터럴 여는 중괄호를 표시하고 다음 작업에서 형식 항목의 결과를 표시한 다음 마지막 작업에서 리터럴 닫는 괄호를 표시합니다.

처리 순서

형식을 지정할 값이 null(Visual Basic에서는 Nothing)이면 빈 문자열("")이 반환됩니다.

지정할 형식이 ICustomFormatter 인터페이스를 구현하는 경우 ICustomFormatter..::.Format 메서드가 호출됩니다.

앞의 단계에서 형식이 지정되지 않고 해당 형식이 IFormattable 인터페이스를 구현하면 IFormattable..::.ToString 메서드가 호출됩니다.

앞의 단계에서 형식이 지정되지 않으면 Object 클래스에서 상속되는 형식의 ToString 메서드가 호출됩니다.

앞의 단계가 수행된 후에 맞춤이 적용됩니다.

다음 예제에서는 합성 형식 지정을 사용하여 만든 문자열과 개체의 ToString 메서드를 사용하여 만든 문자열을 보여 줍니다. 두 형식 지정의 결과는 같습니다.

Visual Basic
Dim FormatString1 As String = String.Format("{0:dddd MMMM}", DateTime.Now)
Dim FormatString2 As String = DateTime.Now.ToString("dddd MMMM") 
string FormatString1 = String.Format("{0:dddd MMMM}", DateTime.Now);
string FormatString2 = DateTime.Now.ToString("dddd MMMM");

오늘이 5월의 목요일이라고 가정할 때 앞의 예제에서 두 문자열의 값은 미국 영어 문화권에서 Thursday May

Console.WriteLineString.Format과 동일한 기능을 노출합니다. 두 메서드가 유일하게 다른 점은 String.Format이 결과를 문자열로 반환하는 반면 Console.WriteLineConsole 개체와 연결된 출력 스트림에 결과를 쓴다는 것입니다. 다음 예제에서는 Console.WriteLine 메서드를 사용하여 MyInt 값을 통화 값 형식으로 지정합니다.

Visual Basic
Dim MyInt As Integer = 100
Console.WriteLine("{0:C}", MyInt)
int MyInt = 100;
Console.WriteLine("{0:C}", MyInt);

이 코드는 현재 문화권이 미국 영어로 설정된 컴퓨터의 콘솔에 $100.00을 표시합니다.

다음 예제에서는 하나의 개체 형식을 두 가지 다른 방법으로 지정하는 경우를 비롯하여 여러 개체의 형식을 지정하는 방법을 보여 줍니다.

Visual Basic
Dim myName As String = "Fred"
String.Format("Name = {0}, hours = {1:hh}, minutes = {1:mm}",
      myName, DateTime.Now)
string myName = "Fred";
String.Format("Name = {0}, hours = {1:hh}, minutes = {1:mm}",
      myName, DateTime.Now);

위 문자열은 "Name = Fred, hours = 07, minutes = 23"으로 출력되며, 여기에서 숫자는 현재 시간을 나타냅니다.

다음 예제에서는 형식 지정에서 맞춤을 사용하는 방법을 보여 줍니다. 형식 지정되는 인수가 세로줄 문자('|') 사이에 위치하면서 결과 맞춤이 강조됩니다.

Visual Basic
Dim myFName As String = "Fred"
Dim myLName As String = "Opals"
Dim myInt As Integer = 100
Dim FormatFName As String = String.Format("First Name = |{0,10}|", myFName)
Dim FormatLName As String = String.Format("Last Name = |{0,10}|", myLName)
Dim FormatPrice As String = String.Format("Price = |{0,10:C }|", myInt)
Console.WriteLine(FormatFName)
Console.WriteLine(FormatLName)
Console.WriteLine(FormatPrice)

FormatFName = String.Format("First Name = |{0,-10}|", myFName)
FormatLName = String.Format("Last Name = |{0,-10}|", myLName)
FormatPrice = String.Format("Price = |{0,-10:C }|", myInt)
Console.WriteLine(FormatFName)
Console.WriteLine(FormatLName)
Console.WriteLine(FormatPrice)
string myFName = "Fred";
string myLName = "Opals";
int myInt = 100;
string FormatFName = String.Format("First Name = |{0,10}|", myFName);
string FormatLName = String.Format("Last Name = |{0,10}|", myLName);
string FormatPrice = String.Format("Price = |{0,10:C}|", myInt); 
Console.WriteLine(FormatFName);
Console.WriteLine(FormatLName);
Console.WriteLine(FormatPrice);

FormatFName = String.Format("First Name = |{0,-10}|", myFName);
FormatLName = String.Format("Last Name = |{0,-10}|", myLName);
FormatPrice = String.Format("Price = |{0,-10:C}|", myInt);
Console.WriteLine(FormatFName);
Console.WriteLine(FormatLName);
Console.WriteLine(FormatPrice);

앞의 코드는 미국 영어 문화권인 콘솔에 다음을 표시합니다. 다른 문화권에서는 해당 통화 기호와 구분 기호가 표시됩니다.

First Name = |          Fred|
Last Name = |         Opals|
Price = |           $100.00|
First Name = |Fred      |
Last Name = |Opals     |
Price = |$100.00   |
반응형