String.Format 메서드 프로그래밍/C#2016. 6. 28. 14:54
String.Format 메서드
https://msdn.microsoft.com/ko-kr/library/system.string.format(v=vs.110).aspx
1. 지정된 형식에 따라 개체의 값을 문자열로 변환하여 다른 문자열에 삽입합니다.
2. String.Format 메서드를 처음 사용하는 경우, String.Format 메서드 시작 섹션에서 대략적인 내용을 살펴보세요.
3. 모든 String.Format 오버로드에 대한 전체 설명서는 설명 섹션을 참조하세요.
<오버로드 목록>
이름 | 설명 | |
![]() ![]() | Format(IFormatProvider, String, Object) | 지정된 문자열에 있는 하나의 형식 항목(the format item) 또는 여러 개의 형식 항목을 해당하는(corresponding) 개체의 문자열 표현(string representation)으로 바꿉니다. 매개 변수에서 문화권별 서식 지정 정보를 제공합니다. |
![]() ![]() | Format(IFormatProvider, String, Object, Object) | 지정된 문자열에 있는 서식 지정 항목을 지정된 두 개체의 문자열 표현으로 바꿉니다. 매개 변수에서 문화권별 서식 지정 정보를 제공합니다. |
![]() ![]() | Format(IFormatProvider, String, Object, Object, Object) | 지정된 문자열의 형식 항목을 지정된 세 개체의 문자열 표현으로 바꿉니다. 매개 변수에서 문화권별 형식 지정 정보를 제공합니다. |
![]() ![]() | Format(IFormatProvider, String, Object[]) | 지정된 문자열의 형식 항목을 지정된 배열에 있는 해당 개체의 문자열 표현으로 바꿉니다. 매개 변수에서 문화권별 서식 지정 정보를 제공합니다. |
![]() ![]() | Format(String, Object) | 지정된 문자열에 있는 하나 이상의 형식 항목을 지정된 개체의 문자열 표현으로 바꿉니다. |
![]() ![]() | Format(String, Object, Object) | 지정된 문자열에 있는 서식 지정 항목을 지정된 두 개체의 문자열 표현으로 바꿉니다. |
![]() ![]() | Format(String, Object, Object, Object) | 지정된 문자열의 형식 항목을 지정된 세 개체의 문자열 표현으로 바꿉니다. |
![]() ![]() | Format(String, Object[]) | 지정된 문자열의 형식 항목을 지정된 배열에 있는 해당 개체의 문자열 표현으로 바꿉니다. |
<설명>
1. 섹션 내용
String.Format 메서드 시작
메서드 구문을 오버 로드 된
매개 변수
반환 값
예외
메서드를 호출 하려면 하나요?
간략 한 형식 메서드에서
는 서식 항목
인수의 서식을 지정 하는 방법
같은 인덱스에 있는 항목의 서식을 지정
서식 지정 및 문화권
사용자 지정 서식 지정 작업
2. 예제:
단일 인수를 형식 지정
두 개의 인수를 형식 지정
세 개의 인수를 형식 지정
세 개 이상의 인수를 형식 지정
문화권 구분 서식 지정
사용자 지정 서식 지정 작업
는 절편 공급자 및 포맷터 로마 숫자
버전 정보
String.Format Q & A
<요약>
<설명> String.Format("{0}, {1}", a, b) {0} 및 {1} : 형식 항목 a, b : 형식 목록 <문자열 삽입> decimal temp = 20.4m; string s = String.Format("The temperature is {0}°C.", temp); // Displays 'The temperature is 20.4°C.' string s = String.Format("At {0}, the temperature is {1}°C.", DateTime.Now, 20.4); // Output similar to: 'At 4/10/2015 9:29:41 AM, the temperature is 20.4°C.' <서식 지정 제어> string s = String.Format("It is now {0:d} at {0:t}", DateTime.Now); // Output similar to: 'It is now 4/10/2015 at 10:04 AM' <간격 제어> String s = String.Format("{0,6} {1,15}\n\n", "Year", "Population"); // {0, 6} {1, 15} : 6과 15는 너비를 의미 <맞춤 제어> String s = String.Format("{0,-10} {1,-10}\n\n", "Year", "Population"); // {0, -10} {0, -10} : 음수는 왼쪽 맞춤을 의미 |
<String.Format 메서드 시작하기>
1. 객체, 변수 또는 식의 값을 다른 문자열에 삽입할 필요가 있다면 String.Format을 사용하세요.
2. 예를 들어, Decimal의 값을 문자열에 삽입해서 사용자에게 다음과 같이 단일 문자열로 표시할 수 있습니다.
Decimal pricePerOunce = 17.36m; String s = String.Format("The current price is {0} per ounce.", pricePerOunce); // Result: The current price is 17.36 per ounce.
3. 그리고 해당 값의 서식(that value's formatting)을 제어할 수 있습니다.
Decimal pricePerOunce = 17.36m; String s = String.Format("The current price is {0:C2} per ounce.", pricePerOunce); // Result if current culture is en-US: // The current price is $17.36 per ounce.
4. 서식 지정 외에서(Besides formatting), 맞춤(alignment) 및 spacing(간격)을 제어할 수 있습니다.
<문자열을 삽입합니다.(Inserting a string)>
1. String.Format 형식 문자열(a format string)로 시작하고, 뒤에 하나 이상의 객체 또는 문자열이 오며 문자열로 변환되어 형식 문자열의 지정된 위치에 삽입됩니다.
decimal temp = 20.4m; string s = String.Format("The temperature is {0}°C.", temp); Console.WriteLine(s); // Displays 'The temperature is 20.4°C.'
2. 형식 문자열(the format string)에서 {0}은 형식 항목(a format item)입니다.
3. 0은 객체의 인덱스이고, 객체의 문자열 값이 해당 위치에 삽입됩니다.
4. 인덱스는 0부터 시작합니다.
5. 삽입될 객체는 문자열이 아닌 경우, 결과 문자열에 삽입되기 전에 ToString 메서드가 호출되어 문자열로 변환됩니다.
6. 객체 목록에서 두 개의 형식 항목과 두 개의 객체를 사용하는 또 다른 예가 있습니다.
string s = String.Format("At {0}, the temperature is {1}°C.", DateTime.Now, 20.4); // Output similar to: 'At 4/10/2015 9:29:41 AM, the temperature is 20.4°C.'
7. 원하는 만큼의 형식 항목과 객체 목록에 객체를 가질 수 있습니다.
8. 모든 형식 항목의 인덱스가 객체 목록에 일치하는 객체를 가지고 있어야 합니다.
9. 어떤 오버로드를 호출하지에 대해서는 걱정할 필요가 없습니다.
10. 컴파일러가 적절한 것을 선택합니다.
<서식 지정 제어(Controlling formatting)>
1. 객체의 형식 항목의 인덱스 뒤에 형식 문자열을 놓아 객체가 어떻게 형식 지정 될지 제어할 수 있습니다.
2. 예를 들어 {0:d}는 "d" 형식 문자열을 객체 목록의 첫번째 객체에 적용합니다.
3. 하나의 객체(a single object)와 두 개의 형식 항목(two format items)에 대한 예제가 있습니다.
string s = String.Format("It is now {0:d} at {0:t}", DateTime.Now); // Output similar to: 'It is now 4/10/2015 at 10:04 AM'
4. 많은 형식이 형식 문자열을 지원합니다.
5. 모든 숫자형 형식(표준 및 커스텀 형식 문자열), 모든 날짜와 시간(표준 및 커스텀 형식 문자열), 시간 간격(time intervals)(표준 및 커스텀 형식 문자열), 모든 열거형 형식(all enumeration types), GUID를 포함합니다.
<간격을 제어합니다.(Controlling spacing)>
1. 12개의 문자로 된 문자열을 삽입하는 {0,12} 와 같은 구문을 사용해서 결과 문자열에 삽입되는 문자열의 길이를 정의할 수 있습니다.
2. 이 경우, 첫 번째 객체의 문자열 표현(the string representation)은 12 문자로 된 필드에 오른쪽 맞춤(right-aligned)합니다.
3. 하지만, 첫 번째 객체의 문자열 표현이 12문자보다 길면 지정한 필드 길이는 무시되고 전체 문자열이 결과 문자열에 삽입됩니다.
4. 다음 예제에서는 문자열 "Year"과 몇개의 연도 문자열을 저장할 6개의 문자 필드를 정의합니다.
5. 그리고 문자열 Population과 몇개의 인구 데이터를 저장할 15문자 필드를 정의합니다.
6. 필드에서 문자들은 오른쪽 맞춤됩니다.
int[] years = { 2013, 2014, 2015 }; int[] population = { 1025632, 1105967, 1148203 }; String s = String.Format("{0,6} {1,15}\n\n", "Year", "Population"); for(int index = 0; index < years.Length; index++) s += String.Format("{0,6} {1,15:N0}\n", years[index], population[index]); // Result: // Year Population // // 2013 1,025,632 // 2014 1,105,967 // 2015 1,148,203
<맞춤을 제어합니다.(Controlling alignment)>
1. 기본적으로(By default), 필드 너비가 지정된 경우 문자열은 해당 필드 내에서 오른쪽 정렬 됩니다.
2. 문자열 필드에서 왼쪽에 맞추려면 필드 너비 앞에 음수 기호(a negative sign를 사용해서(예: {0-12}), 12 문자로된 오른쪽 정렬 필드를 정의합니다.
3. 다음 예제에서는 레이블과 데이터 둘 다 왼쪽 맞춤하는 것을 제외하면 이전 예제와 비슷합니다.
int[] years = { 2013, 2014, 2015 }; int[] population = { 1025632, 1105967, 1148203 }; String s = String.Format("{0,-10} {1,-10}\n\n", "Year", "Population"); for(int index = 0; index < years.Length; index++) s += String.Format("{0,-10} {1,-10:N0}\n", years[index], population[index]); // Result: // Year Population // // 2013 1,025,632 // 2014 1,105,967 // 2015 1,148,203
4. String.Format은 복합 형식 지정 기능을 활용합니다.
int[] years = { 2013, 2014, 2015 }; int[] population = { 1025632, 1105967, 1148203 }; String s = String.Format("{0,-10} {1,-10}\n\n", "Year", "Population"); for(int index = 0; index < years.Length; index++) s += String.Format("{0,-10} {1,-10:N0}\n", years[index], population[index]); // Result: // Year Population // // 2013 1,025,632 // 2014 1,105,967 // 2015 1,148,203
<오버로드된 메서드 구문>
1. 오버로드를 선택하는 방법에 대한 추가 지침(additional guidance)은 어떤 메서드를 호출?을 참조하세요.
1) String String.Format(String format, Object arg0)
형식 항목(the format items)을 지정된 객체의 문자열 표현으로 바꿉니다.(예제)
2) String String.Format(String format, Object arg0, Object arg1)
형식 항목을 지정된 두 객체의 문자열 표현으로 바꿉니다.(예제)
3) String String.Format(String format, Object arg0, Object arg1, Object arg2)
형식 항목을 지정된 두 객체의 문자열 표현으로 바꿉니다.(예제)
4) String String.Format(String format, params Object[] args)
형식 항목을 지정된 배열에 있는 해당 객체의(corresponding objects) 문자열 표현으로 바꿉니다. (예제)
5) String String.Format(IFormatProvider provider, String format, params Object[] args)
형식 항목을 지정된 배열에 있는 해당 객체의 문자열 표현으로 대체하고, 문화권별 서식 지정 정보를 사용하거나 (예제), 또는 커스텀 서식 지정 정보를 사용합니다. (예제)
<매개 변수>
1. 이 표는 Format 메서드의 매개 변수의 전체 목록(a complete list)입니다.
2. 각 오버로드에서 사용되는 매개 변수에 대해서는 위 오버로드 구문을 참조하세요.
3. format 매개 변수만 모든 오버로드에서 사용합니다.
형식 | 설명 | |
---|---|---|
format | 하나 이상의 형식 항목을 포함 하는 합성 형식 문자열 (참조 서식 항목). | |
arg0 | 첫 번째 개체 또는 서식을 지정할 단독 개체입니다. | |
arg1 | 서식을 지정할 두 번째 개체입니다. | |
arg2 | 서식을 지정할 세 번째 개체입니다. | |
args | String[] | 서식을 지정할 0 개 이상의 개체, 컴마로 구분된 목록 또는 배열로 제공됩니다. |
provider | 사용자 지정 또는 문화권별 서식 지정 정보를 제공하는 개체입니다. |
<반환 값>
1. String
2. 항목 형식이 해당 인수의 문자열 표현으로 대체되는 format의 사본
<메서드를 호출하려면 하나요?>
목적 |
호출 |
현재 문화권의 규칙을 사용하여 하나 이상의 객체에 서식을 지정하려면 |
1. provider 매개 변수를 포함하는 오버로드를 제외하고 남아있는 오버로드는 String 매개 변수이고 뒤에 하나 이상의 객체 매개 변수가 옵니다. 2. 이로 인해 어떤 형식 오버로드를 호출할지 확인할 필요가 없습니다. 3. 사용 언어의 컴파일러가 인수 목록을 기반으로 provider 매개 변수가 없는 오버로드 중에서 적절한 오버로드를 선택합니다. 4. 예를 들어, 인수 목록이 5개라면 컴파일러는 Format(String, Object[])를 호출합니다. |
특정 문화권의 규칙을 사용하여 하나 이상의 객체에 서식을 지정하려면 |
1. provider 매개 변수로 시작하는 각 Format 오버로드 뒤에는 String 매개 변수와 하나 이상의 객체 매개 변수가 옵니다. 2. 이로 인해 어떤 특정 Format 오버로드를 호출할지 확인할 필요가 없습니다. 3. 사용 언어의 컴파일러가 인수 목록을 기반으로 provider 매개 변수를 가진 오버로드 중에서 적절한 오버로드를 선택합니다. 4. 예를 들어 인수 목록이 5개라면 컴파일러는 Format(IFormatProvider, String, Object[]) 메서드를 호출합니다. |
ICustomFormatter 구현 또는 IFormattable 구현으로 커스텀 서식 지정 작업을 수행하려면 |
1. 4개의 오버로드 중 하나는 provider 매개 변수입니다. 2. 컴파일러는 인수 목록을 기반으로 provider 매개 변수를 가진 오버로드 중에서 적절한 오버로드를 선택합니다. |
<소개에서 Format 메서드>
1. Format 메서드의 각 오버로드는 합성 서식 지정 기능을 사용합니다. 합성 형식 문자열에서 서식 항목이라고 하는 0부터 시작하는 인덱스 자리 표시자(zero-based indexed placeholders)를 포함하게 됩니다.
2. 런타임에 각 서식 항목은 매개 변수 목록에서 해당 인수의 문자열 표현으로 대체됩니다.
3. 인수의 값이 null이면 서식 항목은 String.Empty로 대체됩니다.
4. 예를 들어, 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.
<형식 항목>
1. 형식 항목은 다음의 구문을 가집니다.
{ index[,alignment][ :formatString] }
2. 대괄호(Brackets)는 선택적 요소를 나타냅니다(denote).
3. 열고 닫는 중괄호(braces)가 필요합니다.
4. 서식 문자열에 열고 닫는 중괄호 리터럴을 포함하려면, 복합 형식 지정 문서에서 "Escaping Braces" 섹션을 참조하세요.
5. 예를 들어, 통과 값을 서식 지정하려면 서식 항목을 다음과 같이 지정합니다.
String.Format("{0,-10:C}", 126347.89m);
6. 형식 항목에는 다음과 같은 요소이 있습니다.
1) index : 문자열 표현이 문자열의 해당 위치에 포함되는 인수에 대한 제로 베이스 인덱스입니다. 이 인수가 null이면 빈 문자열이 문자열의 해당 위치에 포함됩니다.
2) 맞춤(alignment) : 선택적, 인수가 삽입될 필드의 전체 길이와 오른쪽 맞춤(양수)이나 왼쪽 맞춤(음수)을 나타내는 부호있는 정수를 나타냅니다.
3) formatString : 선택적, 해당 인수의 결과 문자열의 형식을 지정하는 문자열입니다. 생략하면 해당 인수의 매개 변수 없는 ToString 메서드로 호출되어 문자열 표현을 만듭니다. formatString을 지정한다면 형식 항목의 의해서 참조되는 인수는 IFormattable 인터페이스를 구현해야합니다.
- 모든 정수 계열 및 부동 소수점 형식 (표준 숫자 형식 문자열, 사용자 지정 숫자 형식 문자열)
- DateTime와 DateTimeOffset (표준 날짜 및 시간 형식 문자열과 사용자 지정 날짜 및 시간 형식 문자열)
- 모든 열거형 형식 (열거형 형식 문자열)
- TimeSpan 값 (표준 TimeSpan 서식 문자열과 사용자 지정 TimeSpan 서식 문자열)
- GUID (Guid.ToString(String) 메서드)
그러나 모든 사용자 지정 형식은 IFormattable 구현할 수 있고, 기존 형식의 IFormattable 구현을 확장할 수 있습니다.
7. 다음 예제에서는 alignment 및 formatString 인수를 사용해서 서식 지정된 출력을 생성합니다.
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 %
<인수의 서식을 지정하는 방법>
1. 서식 항목이 문자열의 시작 부분에서 순차적으로(sequentially) 처리됩니다.
2. 각 서식 항목은 메서드의 인수 인수 목록에 있는 객체에 해당하는 인덱스가 있습니다.
3. Format 메서드는 인수를 검색해서 다음과 같이 해당 문자열 표현을 파생합니다.
1) 인수가 null이면, 메서드는 결과 문자열에 String.Empty를 삽입합니다.
2) 만약 Format(IFormatProvider, String, Object[]) 오버로드를 호출하고 provider 매개 변수가 ICustomFormatter 인터페이스를 구현한다면, 인수는 provider 객체의 ICustomFormatter.Format(String, Object, IFormatProvider) 메서드에 전달됩니다. 형식 항목이 formatString 인수를 포함한다면 첫번째 인수로 메서드에 전달됩니다. ICustomFormatter 구현이 서식 지정 서비스를 제공할 수 있다면 인수의 문자열 표현을 반환합니다. 그렇지 않으면 null을 반환하고 다음 단계가 실행됩니다.
3) 인수가 IFormattable 인터페이스를 구현한다면 해당 IFormattable.ToString 구현이 호출됩니다.
4) 인수의 매개 변수 없는 ToString 메서드가 Object 클래스로부터 재정의 되었든지 상속되었든지간에 호출됩니다.
4. ICustomFormatter.Format 메서드의 호출을 가로채서(intercept) Format 메서드가 복합 서식 문자열에서 각 서식 항목으로 서식 지정 메서드에 어떤 정보를 넘기는지 확인하려면 Example 7: An intercept provider and Roman numeral formatter을 참조하세요.
<동일한 인덱스에 있는 서식 항목>
1. 인덱스 항목의 인덱스가 인수 목록의 인수의 수보다 크거나 같으면 Format 메서드는 FormatException 예외를 throw 합니다.
2. 그러나 format은 인수보다 더 많은 형식 항목을 포함할 수 있습니다.
3. 다음 예의 Format(String, Object) 메서드 호출에서 인수 목록이 하나의 인수만 가지지만 형식 문자열이 두개의 형식 항목을 포함합니다. 첫번째는 10진수(decimal) 값을 표시하고, 두번째는 16진수(hexadecimal) 값을 표시합니다.
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
<서식 지정 및 문화권>
1. 일반적으로(Generally), 인수 목록의 개체는 CultureInfo.CurrentCulture 속성이 반환하는 현재 문화권의 규칙(the conventions)을 사용하여 해당 문자열 표현으로 변환됩니다.
2. provider 매개 변수를 포함하는 Format 오버로드 중 하나를 호출함으로써 이 동작을 제어할 수 있습니다.
3. provider 매개 변수는 서식 지정 처리를 조정하는(moderate) 사용자 지정 및 특정 문화권 서식 지정 정보를 제공하는 IFormatProvider 구현입니다.
4. IFormatProvider 인터페이스에는 단일 멤버 GetFormat, 즉, 서식 지정 정보를 제공하는 객체를 반환하는 역할을 합니다.
5. .NET Framework에는 문화권별 서식 지정을 제공하는 3개의 IFormatProvider 구현이 있습니다.
1) CultureInfo. GetFormat 메서드는 숫자 값 서식 지정에 대한 문화권별 NumberFormatInfo 객체와 날짜 및 시간 값에 대한 DateTimeFormatInfo 객체를 반환합니다.
2) DateTimeFormatInfo. 날짜와 시간 값에 대한 문화권별 서식 지정을 위해 사용됩니다. 해당 GetFormat 메서드는 자신을 반환합니다.
3) NumberFormatInfo. 숫자 값에 대한 문화권별 서식 지정을 위해 사용됩니다. GetFormat 속성은 자신을 반환합니다.
<사용자 지정 서식 지정 작업>
1. provider 매개 변수 Format(IFormatProvider, String, Object[]) 오버로드를 가지는 Format 메서드의 오버로드 중 하나를 호출해서 사용자 지정 작업을 수행할 수 있습니다.
2. 예를 들어 정수를 id(an identification number) 또는 전화번호로 서식을 지정할 수 있습니다.
3. 사용자 지정 형식 지정을 수행하려면 provider 인수는 IFormatProvider 및 ICustomFormatter 인터페이스를 구현해야 합니다.
4. Format 메서드가 ICustomFormatter 구현에 provider 인수로 전달되면 Format 메서드는 IFormatProvider.GetFormat 구현은 호출하고 ICustomFormatter 형식 객체를 요청합니다.
5. 그런 다음 반환된 ICustomFormatter 객체의 Format 메서드를 호출하고 전달된 복합 문자열에서 각 형식 항목을 서식 지정합니다.
6. 사용자 지정 솔루션 을 제공에 대한 자세한 내용은 방법: 사용자 지정 숫자 형식 공급자와 ICustomFormatter을 정의 및 사용을 참조하십시오.
7. 정수를 서식이 지정된 사용자 지정 번호로 변환하는 예제는 예 6: 사용자 지정 서식 지정 작업을 참조하십시오.
8. 부호 없는 바이트를 로마 숫자(Roman numerals)로 변환하는 예제는 예 7: 절편 공급자 및 로마 숫자 포맷터를 참조하십시오.
<예제 1: 단일 인수를 형식 지정>
1. 다음 예제에서는 Format(String, Object) 메서드를 사용해서 문자열에 각 사용자의 나이 포함합니다(embed).
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: 두 개의 인수를 형식 지정>
1. 이 예제에서는 Format(String, Object, Object) 메서드를 사용해서 제네릭 딕셔너리(TKey, TValue> 객체에 저장된 시간과 온도 데이터를 표시합니다.
2. 형식 문자열은 서식 지정할 객체가 두개이더라도 3 개의 형식 항목을 가집니다.
3. 날짜와 시간 값에 대한 목록의 첫번째 객체가 두개의 형식 항목에 의해 사용되기 때문입니다.
4. 첫번째 형식 항목은 시간을 표시하고, 두번째는 날짜를 표시합니다.
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: 세 개의 인수를 형식 지정>
1. 이 예제에서는 Format(String, Object, Object, Object) 메서드를 사용해서 두 개의 정수 값을 가지는 Boolean And 연산의 결과를 나타내는 문자열을 생성합니다.
2. 형식 문자열은 여섯 개의 형식 항목을 포함하며, 메서드는 매개 변수 목록으로 3개의 항목만을 가집니다. 각 항목은 두 가지의 다른 방법으로 서식 지정되기 때문입니다.
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: 3 개 이상의 인수를 서식 지정>
1. 이 예제에서는 특정 날짜의 최고 및 최저 온도에 대한 데이터를 포함하는 문자열을 만듭니다.
2. 복합 형식 문자열은 C# 예제에서는 5 개의 형식 항목을 가지고, 비주얼 베이직 예제에서는 6 개를 가집니다.
3. 형식 항목 중 2 개는 해당 값의 문자열 표현의 넓이를 정의하고, 첫 번째 항목 또한 표준 날짜와 시간 형식 문자열을 포함합니다.
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)
4. 형식을 지정할 개체를 인수 목록이 아닌 배열로 전달할 수도 있습니다.
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: 문화권 구분 서식 지정>
1. 이 예제에서는 여러 다른 문화권으로 일부 날짜와 시간 값과 숫자 값의 문자열 표현을 표시하기 위해서 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: 사용자 지정 서식 지정 작업>
1. 이 예제에서는 양식 x-xxxxx-xx의 고객 계정 번호를 정수 값으로 서식 지정하는 format provider를 정의합니다.
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: 절편 공급자 및 포맷터 로마 숫자>
1. 이 예제에서는 두 가지를 수행하는 ICustomFormatter 및 IForProvider 인터페이스를 구현하는 사용자 지정 형식 공급자를 정의합니다.
1) ICustomFormatter.Format 구현에 절달되는 매개 변수를 표시합니다.
2) 그렇게 함으로써 Format(IFormatProvider, String, Object[]) 메서드가 서식 지정을 하려는 각 개체에 대한 사용자 지정 서식 지정 구현에 어떤 매개 변수를 넘기는지 볼 수 있습니다.
3) 디버깅 할 때 유용할 수 있습니다.
4) 서식을 지정할 객체가 "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
<버전 정보>
1. .NET Framework - 모든 오버로드 지원 : 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
2. .NET Framework Client Profile - 모든 오버로드 지원 : 4, 3.5 SP1
3. 이식 가능한(Portable) 클래스 라이브러리 - Format(String, Object[]), Format(IFormatProvider, String, Object[]) 만 지원
4. 윈도우 스토어 앱용 .NET - 윈도우 8에서 Format(String, Object[]), Format(IFormatProvider, String, Object[]) 만 지원
<String.Format Q&A>
1. 형식 항목으로 사용할 수 있는 미리 정의된 형식 문자열의 목록을 어디서 찾을 수 있습니까?
1) 모든 정수 계열 및 부동 소수점 형식에 대해서 표준 숫자 형식 문자열과 사용자 지정 숫자 형식 문자열을 참조하세요.
2) 날짜 및 시간 값에 대해서 표준 날짜와 시간 형식 문자열과 사용자 지정 날짜 및 시간 형식 문자열을 참조하세요.
3) 열거형 값에 대해서 열거형 형식 문자열을 참조하세요.
4) TimeSpan 값에 대해서 표준 TimeSpan 형식 문자열과 사용자 지정 TimeSpan 형식 문자열을 참조하세요.
5) Guid 값에 대해서 Guid.ToString(String) 참조 페이지의 설명(Remarks) 섹션을 참조하세요.
2. 형식 항목을 대체하는 경우 결과 문자열의 맞춤을 제어하는 방법
1) 형식 항목의 일반적인 구문은 다음과 같습니다.
{index[,alignment][: formatString]}
2) alignment는 필드 너비를 정의하는 부호 있는 정수입니다.
3) 이 값이 음수이면 필드에서 텍스트가 왼쪽 맞춤(left-aligned)입니다.
4) 양수이면 오른쪽 맞춤입니다.
3. 소수 구분 기호 뒤의 자릿수를 제어하는 방법
1) "D"(정수만 사용됨), "G", "R", "X"를 제외한 모든 표준 숫자 형식 문자열은 결과 문자열에서 소수 자릿수(the number of decimal digits)를 정의하는 전체 자릿수 지정자(a precision specifier)를 허용합니다.
2) 다음 예제에서는 표준 숫자 형식 문자열을 사용하여 결과 문자열에서 10진수의 수(the number of decimal digits)를 제어합니다.
using System; public class Example { public static void Main() { object[] values = { 1603, 1794.68235, 15436.14 }; string result; foreach (var value in values) { result = String.Format("{0,12:C2} {0,12:E3} {0,12:F4} {0,12:N3} {1,12:P2}\n", Convert.ToDouble(value), Convert.ToDouble(value) / 10000); Console.WriteLine(result); } } } // The example displays the following output: // $1,603.00 1.603E+003 1603.0000 1,603.000 16.03 % // // $1,794.68 1.795E+003 1794.6824 1,794.682 17.95 % // // $15,436.14 1.544E+004 15436.1400 15,436.140 154.36 %
3) 사용자 지정 숫자 형식 문자열을 사용하는 경우 "0" 형식 지정자를 사용해서 결과 문자열에서 10진수 숫자의 수를 제어합니다.
using System; public class Example { public static void Main() { decimal value = 16309.5436m; string result = String.Format("{0,12:#.00000} {0,12:0,000.00} {0,12:000.00#}", value); Console.WriteLine(result); } } // The example displays the following output: // 16309.54360 16,309.54 16309.544
5. 정수 계열 자릿수를 제어하는 방법
1) 기본적으로 서식 지정 작업은 0이 아닌 정수 계열 숫자(non-zero integral digits)만을 표시합니다.
2) 정수를 서식 지정하는 경우 전체 자릿수 지정자를 "D"와 "X"와 함께 사용해서 숫자의 수를 제어할 수 있습니다.
using System; public class Example { public static void Main() { int value = 1326; string result = String.Format("{0,10:D6} {0,10:X8}", value); Console.WriteLine(result); } } // The example displays the following output: // 001326 0000052E
3) "0" 사용자 지정 숫자 형식 지정자를 사용하여 정수 또는 부동 소수점 수의 앞에 0으로 채워서 정수 계열 숫자의 지정된 수를 가진 결과 문자열을 만들어 낼 수 있습니다.
using System; public class Example { public static void Main() { int value = 16342; string result = String.Format("{0,18:00000000} {0,18:00000000.000} {0,18:000,0000,000.0}", value); Console.WriteLine(result); } } // The example displays the following output: // 00016342 00016342.000 0,000,016,342.0
6. 형식 목록에서 포함할 수 있는 항목 수는 몇개입니까?
1) 실질적인 제한은 없습니다(There is no practical limit).
2) Format(IFormatProvider, String, Object[]) 메서드의 두 번째 매개 변수는 ParamArrayAttribute 태그가 붙는데(tagged with), 이것은 형식 목록으로 쉼표로 구분된 목록(a delimited list) 또는 객체 배열을 포함할 수 있습니다.
7. 결과 문자열에 리터럴 중괄호 ("{" 및 "}")를 어떻게 포함합니까?
1) 예를 들어, 다음 메서드 호출이 FormatException 예외를 throw하는 것을 어떻게 방지하나요?
result = String.Format("The text has {0} '{' characters and {1} '}' characters.",
nOpen, nClose);
2) 하나(a single)의 여는 또는 닫는 중괄호는 항상 형식 항목의 시작이나 끝으로 해석됩니다.
3) 문자 그대로 해석되려면(To be interpreted literally), 이스케이프되어야 합니다.
4) 다음 예제처럼 하나의 중괄호를 더 추가함으로써 중괄호를 이스케이프 합니다.
result = String.Format("The text has {0} '{{' characters and {1} '}}' characters.",
nOpen, nClose);
5) 그러나 이스케이프 된 중괄호는 쉽게 잘못 해석(misunderstand)됩니다.
6) 다음 예제에서처럼 형식 목록에 중괄호를 포함하고 형식 항목을 사용해서 결과 문자열에 삽입할 것을 권장합니다.
result = String.Format("The text has {0} '{1}' characters and {2} '{3}' characters.", nOpen, "{", nClose, "}");
8. String.Format 메서드 호출이 왜 FormatException 를 throw 합니까?
1) 가장 일반적인 예외의 원인은 형식 항목의 인덱스가 형식 목록의 객체에 해당되지 않기 때문입니다.
2) 일반적으로 형식 항목의 인덱스를 잘못 붙였거나 형식 목록의 객체를 포함시키는걸 잊었다는 것을 나타냅니다.
3) 때때로(Occasionally), 예외는 오타의 결과입니다.
4) 예를 들어 일반적인 실수는 왼쪽 중괄호(the left bracket)를 왼쪽 대괄호(the left bracket)로 잘못 입력(mistype)하는 것입니다.
9. Format(System.IFormatProvider, System.String.System.Object[]) 메서드가 매개 변수 배열을 지원한다면 배열을 사용할 때 예외를 throw 하는 이유는 무엇입니까?
1) 예를 들어 다음 코드는 FormatException 예외를 throw 합니다.
using System; using System.Collections.Generic; public class Example { public static void Main() { Random rnd = new Random(); int[] numbers = new int[4]; int total = 0; for (int ctr = 0; ctr <= 2; ctr++) { int number = rnd.Next(1001); numbers[ctr] = number; total += number; } numbers[3] = total; Console.WriteLine("{0} + {1} + {2} = {3}", numbers); } }
2) 컴파일러의 오버로드 확인 문제(a problem of compile overload resolution)입니다.
3) 컴파일러가 정수 배열을 객체 배열로 변환할 수 없기 때문에 정수 배열을 단일 인수로 처리해서 Formoat(String, Object) 메서드를 호출합니다.
4) 4개의 형식 항목이 있지만 한개의 항목만이 형식 목록에 있기 때문에 예외가 throw 합니다.
5) 비주얼 베이직이나 C#은 정수 배열을 객체 배열로 변활할 수 없으므로 직접 변환해서 Format(String, Object[]) 메서드를 호출해야 합니다.
6) 다음 예제에서는 하나의 구현을 제공합니다.
using System; using System.Collections.Generic; public class Example { public static void Main() { Random rnd = new Random(); int[] numbers = new int[4]; int total = 0; for (int ctr = 0; ctr <= 2; ctr++) { int number = rnd.Next(1001); numbers[ctr] = number; total += number; } numbers[3] = total; object[] values = new object[numbers.Length]; numbers.CopyTo(values, 0); Console.WriteLine("{0} + {1} + {2} = {3}", values); } }
표준 숫자 형식 문자열
1. 표준 숫자 형식 문자열은 일반적인 숫자 형식에 서식을 지정하는데 사용됩니다.
2. 표준 숫자 형식 문자열은 Axx와 같은 형식을 취합니다(take the form Axx).
1) A는 서식 지정자(the format specifier)라고 하는단일 영문자(a single alphabetic character)입니다.
2) 공백(white space)을 포함하여 두 개 이상의 영문자를 포함하는 모든 숫자 형식 문자열은 사용자 지정 숫자 형식 문자열로 해석됩니다.
3) 자세한 내용은 사용자 지정 숫자 형식 문자열을 참조하세요.
4) xx는 전체 자릿수 지정자(precision specifier)라고 하는 선택적 정수입니다.
5) 전체 자릿수 지정자는 0에서 99 사이의 범위이며 결과에서 자릿수(the number of digits)에 영향을 줍니다.
6) 전체 자릿수 지정자는 숫자의 문자열 표현에서 자릿수를 제어합니다.
7) 숫자 자체는 반올림(round)하지 않습니다.
8) 반올림 연산(a rounding operation)을 수행하려면 Math.Ceiling, Math.Floor 또는 Math.Round 메서드를 사용합니다.
9) 전체 자릿수 지정자가 결과 문자열에서 소수 자릿수를 제어하는 경우, 결과 문자열은 0에서 멀어지는 쪽으로 반올림되는 숫자를 반영합니다.(즉, MidPointRounding.AwayFromZero 사용)
3. 표준 숫자 문자열 서식 문자열은 모든 숫자 형식의 ToString 메서드의 몇개의 오버로드로 지원됩니다.
4. 예를 들어 숫자 서식 문자열을 ToString(String)와 Int32 형식의 ToString(String, IFormatProvider) 메서드에 제공할 수 있습니다.
5. 표준 숫자 서식 문자열은 Console의 몇개의 Write와 WriteLine 메서드와 StreamWriter 클래스에서 사용되는 .NET Framework 복합 서식 지정 기능, String.Format 메서드, StringBuilder.AppendFormat 메서드에 의해서 지원됩니다.
6. 복합 서식 지정을 사용하여 단일 문자열에서 여러 데이터 항목의 문자열 표현을 포함할 수 있고, 필드 너비를 지정하며, 필드에서 숫자를 맞출 수 있습니다.
7. 자세한 내용은 복합 형식 지정을 참조하세요.
팁 |
서식 문자열을 숫자나 날짜와 시간 값에 적용할 수 있고, 결과 문자열을 표시할 수 있는 서식 지정 유틸리리티를 다운로드 할 수 있습니다. |
8. 다음 표에서는표준 숫자 서식 지정자를 설명하고 각 서식 지정자에 의한 샘플 출력을 보여줍니다.
9. 표준 숫자 서식 문자열 사용에 대한 자세한 내용은 참고 단원(Notes section)을 참고하고, 이러한 사용 방법을 자세히 보여주는 예제(a comprehensive illustration)를 보려면 예제 단원을 참조하세요.
형식 지정자 | 이름 | 설명 | 예제 |
---|---|---|---|
"C" 또는 "c" | 통화 | 결과: 통화 값(A currency value) 지원되는 형식: 모든 숫자 형식 전체 자릿수 지정자: 소수 자릿수 기본 전체 자릿수 지정자:NumberFormatInfo.CurrencyDecimalDigits에 의해 정의됨 추가 정보: 통화("C") 서식 지정자. | 123.456 ("C", en-US) -> $123.46 123.456 ("C", fr-FR) -> 123,46 € 123.456 ("C", ja-JP) -> ¥123 -123.456 ("C3", en-US) -> ($123.456) -123.456 ("C3", fr-FR) -> -123,456 € -123.456 ("C3", ja-JP) -> -¥123.456 |
"D" 또는 "d" | Decimal | 결과: 정수(선택적 음수 기호 포함) 지원되는 형식: 정수 계열 형식만 지원됨 전체 자릿수 지정자: 최소 자릿수 기본 전체 자릿수 지정자: 필요한 최소 자릿수 추가 정보: 10진수("D") 서식 지정자. | 1234 ("D") -> 1234 -1234 ("D6") -> -001234 |
"E" 또는 "e" | 지수(과학적 표기법) | 결과: 지수 표기법(Exponential notation) 지원되는 형식: 모든 숫자 형식 전체 자릿수 지정자: 소수 자릿수 기본 전체 자릿수 지정자: 6 추가 정보: "E"(지수) 서식 지정자. | 1052.0329112756 ("E", en-US) -> 1.052033E+003 1052.0329112756 ("e", fr-FR) -> 1,052033e+003 -1052.0329112756 ("e2", en-US) -> -1.05e+003 -1052.0329112756 ("E2", fr_FR) -> -1,05E+003 |
"F" 또는 "f" | 고정 소수점 | 결과: 선택적 음수 기호가 있는 정수 부분과 소수 부분(decimal digits) 지원되는 형식: 모든 숫자 형식 전체 자릿수 지정자: 소수 자릿수 기본 전체 자릿수 지정자: NumberFormatInfo.NumberDecimalDigits에 의해 정의됨 | 1234.567 ("F", en-US) -> 1234.57 1234.567 ("F", de-DE) -> 1234,57 1234 ("F1", en-US) -> 1234.0 1234 ("F1", de-DE) -> 1234,0 -1234.56 ("F4", en-US) -> -1234.5600 -1234.56 ("F4", de-DE) -> -1234,5600 |
"G" 또는 "g" | 일반 | 결과: 가장 간단한 형태의 고정 소수점(fixed-point) 또는 과학적 표기법(scientific notation) 지원되는 형식: 모든 숫자 형식 전체 자릿수 지정자: 유효 자릿수 기본 전체 자릿수 지정자: 숫자 형식에 따라 다름 | -123.456 ("G", en-US) -> -123.456 -123.456 ("G", sv-SE) -> -123,456 123.4546 ("G4", en-US) -> 123.5 123.4546 ("G4", sv-SE) -> 123,5 -1.234567890e-25 ("G", en-US) -> -1.23456789E-25 -1.234567890e-25 ("G", sv-SE) -> -1,23456789E-25 |
"N" 또는 "n" | 숫자 | 결과: 선택적 음수 기호가 있는 정수 부분과 소수 부분, 그룹 구분 기호(group separators) 및 소수 구분 기호(decimal separator) 지원되는 형식: 모든 숫자 형식 전체 자릿수 지정자: 필요한 소수 자릿수 기본 전체 자릿수 지정자: NumberFormatInfo.NumberDecimalDigits에 의해 정의됨 | 1234.567 ("N", en-US) -> 1,234.57 1234.567 ("N", ru-RU) -> 1 234,57 1234 ("N1", en-US) -> 1,234.0 1234 ("N1", ru-RU) -> 1 234,0 -1234.56 ("N3", en-US) -> -1,234.560 -1234.56 ("N3", ru-RU) -> -1 234,560 |
"P" 또는 "p" | 백분율 | 결과: 100으로 곱하고(multipled by 100) 백분율 기호(percent symbol)와 함께 표시되는 숫자 지원되는 형식: 모든 숫자 형식 전체 자릿수 지정자: 필요한 소수 자릿수 기본 전체 자릿수 지정자: NumberFormatInfo.PercentDecimalDigits에 의해 정의됨 | 1 ("P", en-US) -> 100.00 % 1 ("P", fr-FR) -> 100,00 % -0.39678 ("P1", en-US) -> -39.7 % -0.39678 ("P1", fr-FR) -> -39,7 % |
"R" 또는 "r" | 라운드트립 | 결과: 해당 숫자로 라운드트립할 수 있는 문자열 전체 자릿수 지정자: 무시됨 | 123456789.12345678 ("R") -> 123456789.12345678 -1234567890.12345678 ("R") -> -1234567890.1234567 |
"X" 또는 "x" | 16진수 | 결과: 16진수 문자열 지원되는 형식: 정수 계열 형식만 지원됨 전체 자릿수 지정자: 결과 문자열의 자릿수 | 255 ("X") -> FF -1 ("x") -> ff 255 ("x4") -> 00ff -1 ("X4") -> 00FF |
기타 모든 단일 문자 | 알 수 없는 지정자 | 결과: 런타임에 FormatException이 throw됨 |
|
표준 숫자 서식 문자열 사용
1. 표준 숫자 서식 문자열은 두가지 방법 중 하나로 숫자 값의 서식을 정의할 수 있습니다.
2.1.1. format 매개 변수가 포함된 ToString 메서드의 오버로드로 전달될 수 있습니다.
2.1.2. 다음 예제에서는 숫자 값을 현재 문화권의(이 예제의 경우 en-US) 통화 값으로 서식 지정할 수 있습니다.
decimal value = 123.456m; Console.WriteLine(value.ToString("C2")); // Displays $123.46
2.2.1. String.Format, Console.WriteLine, StringBuilder.AppendFormat와 같은 메서드와 함께 formatString 인수로 제공될 수 있습니다.
2.2.2. 자세한 내용은 복합 형식 지정을 참조하세요.
2.2.3. 다음 예제에서는 서식 항목을 사용해서 문자열의 통화 값을 삽입합니다.
decimal value = 123.456m; Console.WriteLine("Your account balance is {0:C2}.", value); // Displays "Your account balance is $123.46."
2.2.4. 필요에 따라(Optionally), alignment 인수를 제공하여 숫자 필드의 너비와 그 값이 오른쪽 맞춤인지 왼쪽 맞춤인지 지정할 수 있습니다.
2.2.5. 다음 예제에서는 28문자 필드에 통화 값을 왼쪽 맞춤하고 14문자 필드에 통화 값을 오른쪽 맞춤합니다.
decimal[] amounts = { 16305.32m, 18794.16m }; Console.WriteLine(" Beginning Balance Ending Balance"); Console.WriteLine(" {0,-28:C2}{1,14:C2}", amounts[0], amounts[1]); // Displays: // Beginning Balance Ending Balance // $16,305.32 $18,794.16
통화("C") 서식 지정자
1. 통화("C") 서식 지정자는 숫자를 통화 금액(a currency amount)을 나타내는 문자열로 변환합니다.
2. 전체 자릿수 지정자(the precision specifier)는 결과 문자열에 소수 자리(decimal places)의 필요한(desired) 수를 나타냅니다.
3. 전체 자릿수를 생략하면 기본 전체 자릿수는 NumberFormatInfo.CurrencyDecimalDigits 속성에 의해 정의됩니다.
4. 서식을 지적할 값이 지정된 또는 기본 소수 자릿수보다 크다면 결과 문자열에서 소수 값이(the fractional value) 반올림됩니다(round).
5. 지정된 소수 자릿수의 오른쪽 값이 5 이상의 값이라면 결과 문자열의 마지막 숫자는 0에서 멀어지는 반올림됩니다(round away from zero)
6. 결과 문자열은 현재 NumberFormatInfo 객체의 서식 지정 정보에 영향을 받습니다.
7. 다음 표에서는 반환되는 문자열의 서식 지정을 제어하는 NumberFormatInfo 속성의 목록입니다.
설명 | |
---|---|
양수 값의 통화 기호 위치를 정의합니다. | |
음수 값의 통화 기호 위치를 정의하고 음수 기호를 괄호로 나타낼지 아니면 NegativeSign 속성으로 나타낼지 여부를 지정합니다. | |
CurrencyNegativePattern이 괄호가 사용되지 않음을 나타내는 경우에 사용되는 음수 기호를 정의합니다. | |
통화 기호를 정의합니다. | |
통합 값의 기본 소수 자릿수를 정의합니다. 전체 자릿수 지정자를 사용하여 이 값을 재정의할 수 있습니다. | |
정수 부분과 소수 부분을 구분하는 문자열을 정의합니다. | |
정수 그룹을 구분하는 문자열을 정의합니다. | |
그룹에 표시할 정수 자릿수를 정의합니다. |
8. 다음 예제에서는 통화 형식 지정자로 Double 값을 서식 지정합니다.
double value = 12345.6789; Console.WriteLine(value.ToString("C", CultureInfo.CurrentCulture)); Console.WriteLine(value.ToString("C3", CultureInfo.CurrentCulture)); Console.WriteLine(value.ToString("C3", CultureInfo.CreateSpecificCulture("da-DK"))); // The example displays the following output on a system whose // current culture is English (United States): // $12,345.68 // $12,345.679 // kr 12.345,679
10진수("D") 서식 지정자
1. 10진수("D") 서식 지정자는 숫자를 10진수(0-9)의 문자열로 변환합니다.
2. 숫자가 음수라면 마이너스 기호가 앞에 붙습니다.
3. 이 서식은 정수 계열 형식에만 사용됩니다.
4. 전체 자릿수 지정자는 결과 문자열에 최소 자릿수를 나타냅니다.
5. 지정된다면 전체 자릿수에 주어진 숫자를 만들어 내도록 왼쪽에 0으로 채웁니다.
6. 전체 자릿수가 지정되지 않으면 기본값은 앞에 0이 없는 정수를 나타내는 데 필요한 최소값입니다.
7. 결과 문자열은 현재 NumberFormatInfo 객체의 서식 지정 정보에 의해 영향을 받습니다.
8. 다음 표와 같이 단일 속성은 결과 문자열의 서식 지정에 영향을 줍니다.
설명 | |
---|---|
숫자가 음수임을 나타내는 문자열을 정의합니다. |
8. 다음 예제에서는 10진수 서식 지정자로 Int32 값을 서식 지정합니다.
int value; value = 12345; Console.WriteLine(value.ToString("D")); // Displays 12345 Console.WriteLine(value.ToString("D8")); // Displays 00012345 value = -12345; Console.WriteLine(value.ToString("D")); // Displays -12345 Console.WriteLine(value.ToString("D8")); // Displays -00012345
지수("E") 서식 지정자
1. 지수("E") 서식 지정자는 숫자를 "-d.ddd...E+ddd" or "-d.ddd...e+ddd"의 형태의 문자열로 변환합니다.
2. 각 "d"는 숫자(0-9)를 나타냅니다.
3. 숫자가 음수이면 문자열은 마이너스 기호로 시작합니다.
4. 소수점(the decimal point) 앞에는 항상 숫자가 하나만 있어야 합니다.
5. 전체 자릿수 지정자는 소수점 뒤의 숫자의 갯수를 나타냅니다.
6. 전체 자릿수 지정자가 생략되면 소수점 뒤에 기본 6자리가 사용됩니다.
7. 서식 지정자 대/소문자(the case)는 지수에 "E" 또는 "e" 접두사를 붙일 것인지를 나타냅니다.
8. 지수는 항상 플러스 또는 마이너스 기호 그리고 최소 세개의 숫자로 구성됩니다.
9. 필요하면 지수를 0으로 채워서 이 조건을 만족시킵니다.
10. 결과 문자열은 현재 NumberFormatInfo 객체의 서식 지정 정보에 영향을 받습니다.
11. 다음 표에서는 반환된 문자열의 서식 지정을 제어하는 NumberFormatInfo 속성을 나열합니다.
설명 | |
---|---|
계수와 지수가 둘 다 음수임을 나타내는 문자열을 정의합니다. | |
계수에서 정수 부분(the integral digit)과 소수 부분(decimal digits)을 구분하는 문자열을 정의합니다. | |
지수가 양수임을 나타내는 문자열을 정의합니다. |
12. 다음 예제에서는 지수 형식 지정자로 Double 값을 서식 지정합니다.
double value = 12345.6789; Console.WriteLine(value.ToString("E", CultureInfo.InvariantCulture)); // Displays 1.234568E+004 Console.WriteLine(value.ToString("E10", CultureInfo.InvariantCulture)); // Displays 1.2345678900E+004 Console.WriteLine(value.ToString("e4", CultureInfo.InvariantCulture)); // Displays 1.2346e+004 Console.WriteLine(value.ToString("E", CultureInfo.CreateSpecificCulture("fr-FR"))); // Displays 1,234568E+004
고정 소수점("F") 서식 지정자
1. 고정 소수점("F") 서식 지정자는 "-ddd.ddd..." 형태의 문자열로 변환합니다.
2. 각 "d"는 숫자(0-9)를 나타냅니다.
3. 숫자가 음수이면 문자열은 마이너스 기호로 시작합니다.
4. 전체 자릿수 지정자는 필요한 소수 자릿수를 나타냅니다.
5. 전체 자릿수 지정자를 생략하면 현재 NumberFormatInfo.NumberDecimalDigits 속성이 숫자 전체 자릿수를 제공합니다.
6. 결과 문자열은 현재 NumberFormatInfo 객체의 서식 지정 정보에 의해 영향을 받습니다.
7. 다음 표에서는 결과 문자열의 서식 지정을 제어하는 NumberFormatInfo 객체의 속성을 나열합니다.
NumberFormatInfo 속성 | 설명 |
---|---|
숫자가 음수임을 나타내는 문자열을 정의합니다. | |
정수 부분과 소수 부분을 구분하는 문자열을 정의합니다. | |
기본 소수 자릿수를 정의합니다. 전체 자릿수 지정자를 사용하여 이 값을 재정의할 수 있습니다. |
8. 다음 예제에서는 고정 소수점 서식 지정자(the fixed-point format specifier)로 Double과 Int32를 서식 지정합니다.
int integerNumber; integerNumber = 17843; Console.WriteLine(integerNumber.ToString("F", CultureInfo.InvariantCulture)); // Displays 17843.00 integerNumber = -29541; Console.WriteLine(integerNumber.ToString("F3", CultureInfo.InvariantCulture)); // Displays -29541.000 double doubleNumber; doubleNumber = 18934.1879; Console.WriteLine(doubleNumber.ToString("F", CultureInfo.InvariantCulture)); // Displays 18934.19 Console.WriteLine(doubleNumber.ToString("F0", CultureInfo.InvariantCulture)); // Displays 18934 doubleNumber = -1898300.1987; Console.WriteLine(doubleNumber.ToString("F1", CultureInfo.InvariantCulture)); // Displays -1898300.2 Console.WriteLine(doubleNumber.ToString("F3", CultureInfo.CreateSpecificCulture("es-ES"))); // Displays -1898300,199
일반("G") 서식 지정자
1. 일반("G") 서식 지정자는 숫자를 숫자의 형식과 전체 지정자가 존재하는지에 따라 가장 간단한 고정 소수점이나 과학적 표기법(scientific notation)으로 변환합니다.
2. 전체 자릿수 지정자는 결과 문자열에 표시(appear)할 수 있는 최대 유효 자릿수(the maximum number of significant digits)를 정의합니다.
3. 전체 자릿수 지정자가 생략되거나 0이면 숫자 형식은 다음 표에 나와 있는 대로 기본 자릿수(the default precision)를 결정합니다.
숫자 형식 | 기본 전체 자릿수 |
---|---|
3개의 자릿수 | |
5개의 자릿수 | |
10개의 자릿수 | |
19개의 자릿수 | |
20개의 자릿수 | |
50개의 자릿수 | |
7개의 자릿수 | |
15개의 자릿수 | |
29개의 자릿수 |
4. 숫자를 과학적 표기법을 표현해서 나온 지수가 -5보다 크고 전체 자릿수 지정자보다 작다면 고정 소수점 자릿수가 사용되고 그렇지 않으면 과학적 표기법이 사용됩니다.
5. 필요한 경우(if required), 결과는 소수 점 뒤 0은 생략됩니다.
6. 전체 자릿수 지정자가 있고 결과의 유효 숫자가 지정된 자릿수를 초과하면 초과된 숫자는 반올림되어 제거됩니다.
7. 그러나 숫자가 Decimal이고 전체 자릿수 지정자가 생략되면 고정 소수점 표기법이 항상 사용되고 뒤에 오는 0은 유지됩니다(preserve).
8. 과학적 표기법이 사용되면 서식 지정자가 'G'인 경우 "E"가 앞에 붙고 "g"인 경우 "e"가 앞에 붙습니다.
9. 지수는 최소 두개의 숫자를 포함합니다.
10. 지수에서 최소 3개의 숫자를 포함하는 지수 형식 지정자에 의해 생성된 과학적 표기법의 서식과 다릅니다.
11. 결과 문자열은 NumberFormatInfo 객체의 서식 지정 정보에 영향을 받습니다.
12. 다음 표에서는 결과 문자열의 서식 지정을 제어하는 NumberFormatInfo 속성을 나열합니다.
NumberFormatInfo 속성 | 설명 |
---|---|
숫자가 음수임을 나타내는 문자열을 정의합니다. | |
정수 부분과 소수 부분을 구분하는 문자열을 정의합니다. | |
지수가 양수임을 나타내는 문자열을 정의합니다. |
13. 다음 예제에서는 일반 서식 지정자를 사용하여 분류된(assorted) 부동 소수점 값에 서식을 지정합니다.
double number; number = 12345.6789; Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture)); // Displays 12345.6789 Console.WriteLine(number.ToString("G", CultureInfo.CreateSpecificCulture("fr-FR"))); // Displays 12345,6789 Console.WriteLine(number.ToString("G7", CultureInfo.InvariantCulture)); // Displays 12345.68 number = .0000023; Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture)); // Displays 2.3E-06 Console.WriteLine(number.ToString("G", CultureInfo.CreateSpecificCulture("fr-FR"))); // Displays 2,3E-06 number = .0023; Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture)); // Displays 0.0023 number = 1234; Console.WriteLine(number.ToString("G2", CultureInfo.InvariantCulture)); // Displays 1.2E+03 number = Math.PI; Console.WriteLine(number.ToString("G5", CultureInfo.InvariantCulture)); // Displays 3.1416
숫자("N") 서식 지정자
1. 숫자("N") 서식 지정자는 숫자를 "-d,ddd,ddd.ddd..." 형태의 문자열로 변환합니다.
2. 여기서 "-"는 필요한 경우 음수 기호를 나타내고, "d"는 숫자(0-9)를 나타내고 ","은 그룹 구분 기호를 나타내고, "." 소수점 기호를 나타냅니다.
3. 전체 자릿수 지정자는 소수점 뒤의 자릿수를 나타냅니다.
4. 전체 자릿수 지정자가 생략되면 현재 NumberFormatInfo.NumberDecimalDigits 속성에 의해 소수 자릿수가 정의됩니다.
5. 결과 문자열은 현재 NumberFormatInfo 객체의 서식 지정 정보에 영향을 받습니다.
6. 다음 표에서는겨로가 문자열의 서식을 제어하는 NumberFormatInfo 속성을 보여줍니다.
NumberFormatInfo 속성 | 설명 |
---|---|
숫자가 음수임을 나타내는 문자열을 정의합니다. | |
음수 값의 서식을 정의하고 음수 기호를 괄호로 나타낼지 아니면 NegativeSign 속성으로 나타낼지 여부를 지정합니다. | |
그룹 구분 기호 사이에 표시할 정수 자릿수를 정의합니다. | |
정수 그룹을 구분하는 문자열을 정의합니다. | |
정수 부분과 소수 부분을 구분하는 문자열을 정의합니다. | |
기본 소수 자릿수를 정의합니다. 전체 자릿수 지정자를 사용하여 이 값을 재정의할 수 있습니다. |
7. 다음 예제에서는 숫자 서식 지정자를 사용하여 분류된(assorted) 부동 소수점 값에 서식을 지정합니다.
double dblValue = -12445.6789; Console.WriteLine(dblValue.ToString("N", CultureInfo.InvariantCulture)); // Displays -12,445.68 Console.WriteLine(dblValue.ToString("N1", CultureInfo.CreateSpecificCulture("sv-SE"))); // Displays -12 445,7 int intValue = 123456789; Console.WriteLine(intValue.ToString("N1", CultureInfo.InvariantCulture)); // Displays 123,456,789.0
백분율("P") 서식 지정자
1. 백분율("P") 서식 지정자는 숫자를 100으로 곱한 다음(multiplies a number by 100) 백분율을 나타내는 문자열로 변환합니다.
2. 전체 자릿수 지정자는 희망하는 소수 자릿수를 나타냅니다.
3. 전체 자릿수 지정자를 기본 숫자 자릿수는 현재 PercentDecimalDigits 속성 값입니다.
4. 다음 표에서는 반환된 문자열의 서식 지정을 제어하는 NumberFormatInfo 속성을 나열합니다.
NumberFormatInfo 속성 | 설명 |
---|---|
양수 값의 백분율 기호 위치를 정의합니다. | |
백분율 기호 위치와 음수 값의 음수 기호 위치(placement)를 정의합니다. | |
숫자가 음수임을 나타내는 문자열을 정의합니다. | |
백분율 기호를 정의합니다. | |
백분율 값의 기본 소수 자릿수를 정의합니다. 전체 자릿수 지정자를 사용하여 이 값을 재정의할 수 있습니다. | |
정수 부분과 소수 부분을 구분하는 문자열을 정의합니다. | |
정수 그룹을 구분하는 문자열을 정의합니다. | |
그룹에 표시할 정수 자릿수를 정의합니다. |
5. 다음 예제에서는 백분율 서식 지정자를 사용하여 부동 소수점 값에 서식을 지정합니다.
double number = .2468013; Console.WriteLine(number.ToString("P", CultureInfo.InvariantCulture)); // Displays 24.68 % Console.WriteLine(number.ToString("P", CultureInfo.CreateSpecificCulture("hr-HR"))); // Displays 24,68% Console.WriteLine(number.ToString("P1", CultureInfo.InvariantCulture)); // Displays 24.7 %
라운드트립("R") 서식 지정자
1. 라운드트립("R") 형식 지정자는 문자열로 변환되는 숫자 값이 같은 숫자 값으로 다시 구문 분석되도록 하는 데 사용됩니다.
2. 이 서식은 Single, Double BigInteger 형식에만 사용할 수 있습니다.
3. 이 지정자를 사용하여 BinInteger 값의 서식을 지정하면 해당 문자열 표현에 BigInteger 값의 모든 유효 자릿수가 포함됩니다.
4. 이 지정자를 사용하여 Single 또는 Double 값의 서식을 지정하면 Double은 15자리의 전체 자릿수, Single은 7자리의 전체 자릿수를 가진 일반 서식을 사용하여 이 값을 먼저 테스트합니다.
5. 이 값이 같은 숫자 값으로 다시 구문 분석되면 일반 서식 지정자를 통해 서식이 지정됩니다.
6. 이 값이 같은 숫자 값으로 다시 구문 분석되지 못하면 Double 형식에는 17자리 전체 자릿수를, Single 형식에는 9자리 전체 자릿수를 사용하여 이 값의 서식이 지정됩니다.
7. 전체 자릿수 지정자는 포함되어 있더라도 무시됩니다.
8. 이 지정자를 사용할 때는 라운드트립이 전체 자릿수보다 우선합니다(given precedence over precision)
9. 결과 문자열은 현재 NumberFormatInfo 객체의 서식 지정 정보에 영향을 받습니다.
10. 다음 표에서는 결과 문자열의 서식을 제어하는 NumberFormatInfo 속성을 보여 줍니다.
설명 | |
---|---|
숫자가 음수임을 나타내는 문자열을 정의합니다. | |
정수 부분과 소수 부분을 구분하는 문자열을 정의합니다. | |
지수가 양수임을 나타내는 문자열을 정의합니다. |
11. 다음 에제에서는 라운드트립 서식 지정자를 사용하여 Double 값의 서식을 지정합니다.
double value; value = Math.PI; Console.WriteLine(value.ToString("r")); // Displays 3.1415926535897931 Console.WriteLine(value.ToString("r", CultureInfo.CreateSpecificCulture("fr-FR"))); // Displays 3,1415926535897931 value = 1.623e-21; Console.WriteLine(value.ToString("r")); // Displays 1.623E-21
![]() |
---|
/platform:x64 또는 /platform:anycpu 스위치를 사용하여 컴파일되고 64비트 시스템에서 실행되는 경우 "R" 표준 숫자 형식 문자열로 형식이 지정된 Double 값이 성공적으로 라운드트립되지 않는 경우가 있습니다. 자세한 내용은 다음 단락(paragraph)을 참조하세요. |
12. /platform:x64 또는 /platform:anycpu 스위치를 사용하여 컴파일되고 64비트 시스템에서 실행되는 경우, "R" 표준 숫자 형식 문자열로 서식 지정된 Double 값이 성공적으로 라운드트립되지 않는 문제를 해결하려면(To work around) "G17" 표준 숫자 서식 문자열을 사용하여 Double 값에 서식을 지정하면 됩니다.
13. 다음 예제에서는 성공적으로 라운드트립되지 않는 Double 값으로 "R" 형식 문자열을 사용하고 또한 "G17" 형식 문자열을 사용해서 원래 값을 성공적으로 라운드트립합니다.
using System; using System.Globalization; public class Example { static void Main(string[] args) { Console.WriteLine("Attempting to round-trip a Double with 'R':"); double initialValue = 0.6822871999174; string valueString = initialValue.ToString("R", CultureInfo.InvariantCulture); double roundTripped = double.Parse(valueString, CultureInfo.InvariantCulture); Console.WriteLine("{0:R} = {1:R}: {2}\n", initialValue, roundTripped, initialValue.Equals(roundTripped)); Console.WriteLine("Attempting to round-trip a Double with 'G17':"); string valueString17 = initialValue.ToString("G17", CultureInfo.InvariantCulture); double roundTripped17 = double.Parse(valueString17, CultureInfo.InvariantCulture); Console.WriteLine("{0:R} = {1:R}: {2}\n", initialValue, roundTripped17, initialValue.Equals(roundTripped17)); } } // If compiled to an application that targets anycpu or x64 and run on an x64 system, // the example displays the following output: // Attempting to round-trip a Double with 'R': // 0.6822871999174 = 0.68228719991740006: False // // Attempting to round-trip a Double with 'G17': // 0.6822871999174 = 0.6822871999174: True
16진수("X") 서식 지정자
1. 16진수("X") 서식 지정자는 숫자를 16진수 숫자의 문자열로 변환합니다.
2. 서식 지정자의 대/소문자는 9보다 큰 16진수 숫자에 대한 대문자 또는 소문자를 사용할지 결정합니다.
3. 예를 들어, "X"를 사용하면 "ABCDEF"가 만들어지고 "x"를 사용하면 "abcde"가 만들어집니다.
4. 이 서식은 정수 계열 형식에만 가능합니다.
5. 전체 자릿수 지정자는 결과 문자열에서 희망하는 최소 자릿수를 나타냅니다.
6. 필요하면 수의 왼쪽을 0으로 채워서 전체 자릿수 지정자에서 지정한 자릿수를 만듭니다.
7. 결과 문자열은 현재 NumberFormatInfo 객체에 대한 서식 지정 정보의 영향을 받지 않습니다.
8. 다음 예제에서는 16진수 서식 지정자를 사용하여 Int32 값의 서식을 지정합니다.
int value; value = 0x2045e; Console.WriteLine(value.ToString("x")); // Displays 2045e Console.WriteLine(value.ToString("X")); // Displays 2045E Console.WriteLine(value.ToString("X8")); // Displays 0002045E value = 123456789; Console.WriteLine(value.ToString("X")); // Displays 75BCD15 Console.WriteLine(value.ToString("X2")); // Displays 75BCD15
참고
<제어판 설정>
1. 제어판(Control Panel)에 있는 국가 및 언어 옵션(Regional and Language Options)의 설정(the settings)은 서식 지정 작업으로 생성되는 결과 문자열에 영향을 줍니다.
2. 이러한 설정은 서식을 제어하는 데(govern) 사용되는 값을 제공하는 현재 스레드 문화권과 연결된(associated with) NumberFormatInfo 개체를 초기화하는 데 사용됩니다.
3. 다른 설정을 사용하는 컴퓨터는 다른 결과 문자열을 생성합니다.
4. 또한(In addition), CultureInfo.CultureInfo(String) 생성자가 현재 시스템과 같은 문화권을 나태내는 새로운 CultureInfo 객체를 인스턴스화하기위해 사용된다면 국가 및 언어 옵션에 의해 설정된(established) 어떤 커스터마이제이션도 새로운 CultureInfo 객체에 적용됩니다.
5. CultureInfo.CultureInfo(String, Boolean) 생성자를 사용하면 시스템의 사용자 지정 내용이 반영되지 않는 CultureInfo 객체를 만들 수 있습니다.
<NumberFormatInfo 속성>
1. 서식 지정은 현재 NumberFormatInfo 객체의 속성에 의해 영향을 받으며(influence), 이 객체는 현재 스레드 문화권에 의해 암수적으로 제공되거나 서식 지정을 호출하는 메서드의 IFormatProvider 매개 변수의 의해 명시적으로 제공됩니다.
2. 이 매개 변수에 대해서 NumberFormatInfo 또는 CultureInfo 객체를 지정하세요.
![]() |
---|
숫자 값 서식 지정에 사용되는 패턴 또는 문자열에 대한 자세한 내용은 NumberFormatInfo 클래스 항목을 참조하세요. |
<정수 계열 및 부동 소수점 숫자 형식>
1. 표준 숫자 서식 지정자에 대한 설명 중에는 정수 계열 및 부동 소수점 형식이 언급되어 있습니다.
2. 정수 계열 숫자 형식은 Byte, SByte, Int16, Int32, Int64, UInt32, UInt64 및 BigInteger이고, 부동 소수점 숫자 형식은 Decimal, Single 및 Double입니다.
<부동 소수점 무한대 및 NaN>
1. 서식 문자열에 관계없이, Single 또는 Double 부동 소수점 형식의 값이 양의 무한대, 음의 무한대, 또는 NaN(Not a Number)이면 서식이 지정된 문자열은 각각 현재 적용 가능한(applicable) PositiveInfinitySymbol 객체에서 지정하는 해당 NegativeInfinitySymbol, NanSymbol 또는 NumberFormatInfo 속성의 값입니다.
<예제>
1. 다음 예제에서는 en-US 문화권 및 모든 표준 숫자 서식 지정자를 사용하여 정수 숫자 값과 부동 소수점 숫자 값의 서식을 지정합니다.
2. 이 코드 에제에서는 두 개의 특정 숫자 형식(Double 및 Int32)을 사용하지만 다른 기타 숫자 기본 형식(Byte, SByte, Int16, Int32, UInt16, UInt32, UInt64, BigInteger, Decimal 및 Single)을 사용해도 유사한 결과가 생성됩니다(yield).
using System; using System.Globalization; using System.Threading; public class NumericFormats { public static void Main() { // Display string representations of numbers for en-us culture CultureInfo ci = new CultureInfo("en-us"); // Output floating point values double floating = 10761.937554; Console.WriteLine("C: {0}", floating.ToString("C", ci)); // Displays "C: $10,761.94" Console.WriteLine("E: {0}", floating.ToString("E03", ci)); // Displays "E: 1.076E+004" Console.WriteLine("F: {0}", floating.ToString("F04", ci)); // Displays "F: 10761.9376" Console.WriteLine("G: {0}", floating.ToString("G", ci)); // Displays "G: 10761.937554" Console.WriteLine("N: {0}", floating.ToString("N03", ci)); // Displays "N: 10,761.938" Console.WriteLine("P: {0}", (floating/10000).ToString("P02", ci)); // Displays "P: 107.62 %" Console.WriteLine("R: {0}", floating.ToString("R", ci)); // Displays "R: 10761.937554" Console.WriteLine(); // Output integral values int integral = 8395; Console.WriteLine("C: {0}", integral.ToString("C", ci)); // Displays "C: $8,395.00" Console.WriteLine("D: {0}", integral.ToString("D6", ci)); // Displays "D: 008395" Console.WriteLine("E: {0}", integral.ToString("E03", ci)); // Displays "E: 8.395E+003" Console.WriteLine("F: {0}", integral.ToString("F01", ci)); // Displays "F: 8395.0" Console.WriteLine("G: {0}", integral.ToString("G", ci)); // Displays "G: 8395" Console.WriteLine("N: {0}", integral.ToString("N01", ci)); // Displays "N: 8,395.0" Console.WriteLine("P: {0}", (integral/10000.0).ToString("P02", ci)); // Displays "P: 83.95 %" Console.WriteLine("X: 0x{0}", integral.ToString("X", ci)); // Displays "X: 0x20CB" Console.WriteLine(); } }
'프로그래밍 > C#' 카테고리의 다른 글
StringBuilder 클래스 (0) | 2016.07.09 |
---|---|
대리자 Action, Func (0) | 2016.07.08 |
String 클래스 (0) | 2016.06.22 |
Windows Forms 컨트롤의 다중 스레딩 (0) | 2016.06.21 |
스레드 (0) | 2016.06.14 |