다음을 통해 공유


NumberFormatInfo 클래스

이 문서에서는 이 API에 대한 참조 설명서에 대한 추가 설명서를 제공합니다.

클래스에는 NumberFormatInfo 숫자 값의 서식을 지정하고 구문 분석할 때 사용되는 문화권별 정보가 포함됩니다. 이 정보에는 통화 기호, 10진수 기호, 그룹 구분 기호 및 양수 및 음수 기호가 포함됩니다.

NumberFormatInfo 개체 인스턴스화

현재 문화권, 고정 문화권, 특정 문화권 또는 중립 문화권의 서식 규칙을 나타내는 개체를 인스턴스화 NumberFormatInfo 할 수 있습니다.

현재 문화권에 대한 NumberFormatInfo 개체 인스턴스화

다음과 같은 방법으로 현재 문화권에 대한 개체를 인스턴스화 NumberFormatInfo 할 수 있습니다. 각 경우에서 반환 NumberFormatInfo 된 개체는 읽기 전용입니다.

다음 예제에서는 이러한 세 가지 방법을 사용하여 현재 문화권의 서식 규칙을 나타내는 개체를 만듭니 NumberFormatInfo 다. 또한 속성 값을 IsReadOnly 검색하여 각 개체가 읽기 전용임을 보여 줍니다.

using System;
using System.Globalization;

public class InstantiateEx1
{
    public static void Main()
    {
        NumberFormatInfo current1 = CultureInfo.CurrentCulture.NumberFormat;
        Console.WriteLine(current1.IsReadOnly);

        NumberFormatInfo current2 = NumberFormatInfo.CurrentInfo;
        Console.WriteLine(current2.IsReadOnly);

        NumberFormatInfo current3 = NumberFormatInfo.GetInstance(CultureInfo.CurrentCulture);
        Console.WriteLine(current3.IsReadOnly);
    }
}
// The example displays the following output:
//       True
//       True
//       True

다음과 같은 방법으로 현재 문화권의 규칙을 나타내는 쓰기 가능한 NumberFormatInfo 개체를 만들 수 있습니다.

다음 예제에서는 개체를 인스턴스화하는 NumberFormatInfo 두 가지 방법을 보여 줍니다. 개체가 읽기 전용이 아니라는 것을 보여 주는 속성 값을 IsReadOnly 표시합니다.

using System;
using System.Globalization;

public class InstantiateEx2
{
    public static void Main()
    {
        NumberFormatInfo current1 = NumberFormatInfo.CurrentInfo;
        current1 = (NumberFormatInfo)current1.Clone();
        Console.WriteLine(current1.IsReadOnly);

        CultureInfo culture2 = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
        NumberFormatInfo current2 = culture2.NumberFormat;
        Console.WriteLine(current2.IsReadOnly);
    }
}
// The example displays the following output:
//       False
//       False

Windows 운영 체제를 사용하면 사용자가 제어판 지역 및 언어 항목을 통해 숫자 서식 지정 및 구문 분석 작업에 사용되는 일부 속성 값을 재정의 NumberFormatInfo 할 수 있습니다. 예를 들어 문화권이 영어(미국)인 사용자는 기본값인 $1.1 대신 통화 값을 1.1 USD로 표시하도록 선택할 수 있습니다. 앞에서 설명한 방식으로 검색된 개체는 NumberFormatInfo 모두 이러한 사용자 재정의를 반영합니다. 바람직하지 않은 경우 생성자를 호출 CultureInfo.CultureInfo(String, Boolean) 하고 인수에 대한 useUserOverride 값을 제공하여 사용자 재정의 false 를 반영하지 않고 읽기 전용이 아닌 읽기/쓰기 개체를 만들 NumberFormatInfo 수 있습니다. 다음 예제에서는 현재 문화권이 영어(미국)이고 통화 기호가 기본값인 $에서 USD로 변경된 시스템에 대한 그림을 제공합니다.

using System;
using System.Globalization;

public class InstantiateEx3
{
    public static void Main()
    {
        CultureInfo culture;
        NumberFormatInfo nfi;

        culture = CultureInfo.CurrentCulture;
        nfi = culture.NumberFormat;
        Console.WriteLine("Culture Name:    {0}", culture.Name);
        Console.WriteLine("User Overrides:  {0}", culture.UseUserOverride);
        Console.WriteLine("Currency Symbol: {0}\n", culture.NumberFormat.CurrencySymbol);

        culture = new CultureInfo(CultureInfo.CurrentCulture.Name, false);
        Console.WriteLine("Culture Name:    {0}", culture.Name);
        Console.WriteLine("User Overrides:  {0}", culture.UseUserOverride);
        Console.WriteLine("Currency Symbol: {0}", culture.NumberFormat.CurrencySymbol);
    }
}
// The example displays the following output:
//       Culture Name:    en-US
//       User Overrides:  True
//       Currency Symbol: USD
//
//       Culture Name:    en-US
//       User Overrides:  False
//       Currency Symbol: $

속성이 CultureInfo.UseUserOverride 설정true되면 속성 CultureInfo.DateTimeFormat, CultureInfo.NumberFormatCultureInfo.TextInfo 사용자 설정에서 검색됩니다. 사용자 설정이 개체와 연결된 문화권과 CultureInfo 호환되지 않는 경우(예: 선택한 달력이 속성에 OptionalCalendars 나열된 달력 중 하나가 아닌 경우) 메서드의 결과와 속성 값이 정의되지 않습니다.

고정 문화권에 대한 NumberFormatInfo 개체 인스턴스화

고정 문화권은 문화권을 구분하지 않는 문화권을 나타냅니다. 그것은 영어를 기반으로하지만 특정 영어권 국가 / 지역에 없습니다. 특정 문화권의 데이터는 동적일 수 있으며 새로운 문화권 규칙 또는 사용자 기본 설정을 반영하도록 변경할 수 있지만 고정 문화권의 데이터는 변경되지 않습니다. NumberFormatInfo 고정 문화권의 서식 규칙을 나타내는 개체는 결과 문자열이 문화권에 따라 달라지지 않아야 하는 서식 지정 작업에 사용할 수 있습니다.

다음과 같은 방법으로 고정 문화권의 서식 규칙을 나타내는 개체를 인스턴스화 NumberFormatInfo 할 수 있습니다.

다음 예제에서는 이러한 각 메서드를 사용하여 고정 문화권을 나타내는 개체를 인스턴스화 NumberFormatInfo 합니다. 그런 다음 개체가 읽기 전용인지 여부를 나타냅니다.

using System;
using System.Globalization;

public class InstantiateEx4
{
    public static void Main()
    {
        NumberFormatInfo nfi;

        nfi = System.Globalization.NumberFormatInfo.InvariantInfo;
        Console.WriteLine(nfi.IsReadOnly);

        nfi = CultureInfo.InvariantCulture.NumberFormat;
        Console.WriteLine(nfi.IsReadOnly);

        nfi = new NumberFormatInfo();
        Console.WriteLine(nfi.IsReadOnly);
    }
}
// The example displays the following output:
//       True
//       True
//       False

특정 문화권에 대한 NumberFormatInfo 개체 인스턴스화

특정 문화권은 특정 국가/지역에서 사용되는 언어를 나타냅니다. 예를 들어 en-US는 미국 사용되는 영어를 나타내는 특정 문화권이며 en-CA는 캐나다에서 사용되는 영어를 나타내는 특정 문화권입니다. 다음과 같은 방법으로 특정 문화권의 서식 규칙을 나타내는 개체를 인스턴스화 NumberFormatInfo 할 수 있습니다.

다음 예제에서는 이러한 네 가지 방법을 사용하여 인도네시아(인도네시아) 문화권의 서식 규칙을 반영하는 개체를 만듭니 NumberFormatInfo 다. 또한 각 개체가 읽기 전용인지 여부를 나타냅니다.

using System;
using System.Globalization;

public class InstantiateEx5
{
    public static void Main()
    {
        CultureInfo culture;
        NumberFormatInfo nfi;

        nfi = CultureInfo.GetCultureInfo("id-ID").NumberFormat;
        Console.WriteLine("Read-only: {0}", nfi.IsReadOnly);

        culture = new CultureInfo("id-ID");
        nfi = NumberFormatInfo.GetInstance(culture);
        Console.WriteLine("Read-only: {0}", nfi.IsReadOnly);

        culture = CultureInfo.CreateSpecificCulture("id-ID");
        nfi = culture.NumberFormat;
        Console.WriteLine("Read-only: {0}", nfi.IsReadOnly);

        culture = new CultureInfo("id-ID");
        nfi = culture.NumberFormat;
        Console.WriteLine("Read-only: {0}", nfi.IsReadOnly);
    }
}
// The example displays the following output:
//       Read-only: True
//       Read-only: False
//       Read-only: False
//       Read-only: False

중립 문화권에 대한 NumberFormatInfo 개체 인스턴스화

중립 문화권은 국가/지역과 독립적인 문화권 또는 언어를 나타냅니다. 일반적으로 하나 이상의 특정 문화권의 부모입니다. 예를 들어 fr은 프랑스어와 fr-FR 문화권의 부모에 대한 중립 문화권입니다. 특정 문화권의 서식 규칙을 나타내는 개체를 만드는 것과 같은 방식으로 중립 문화권의 서식 규칙을 나타내는 개체를 만듭니 NumberFormatInfoNumberFormatInfo 다.

그러나 특정 국가/지역과 독립적이므로 중립 문화권에는 문화권별 서식 지정 정보가 부족합니다. .NET은 개체를 NumberFormatInfo 제네릭 값으로 채우는 대신 중립 문화권의 자식인 특정 문화권의 서식 규칙을 반영하는 개체를 반환 NumberFormatInfo 합니다. 예를 들어 NumberFormatInfo 중립 en 문화권의 개체는 en-US 문화권의 서식 규칙을 반영하고 NumberFormatInfo fr 문화권의 개체는 fr-FR 문화권의 서식 규칙을 반영합니다.

다음과 같은 코드를 사용하여 각 중립 문화권이 나타내는 특정 문화권의 서식 규칙을 결정할 수 있습니다.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;

public class InstantiateEx6
{
    public static void Main()
    {
        // Get all the neutral cultures
        List<String> names = new List<String>();
        Array.ForEach(CultureInfo.GetCultures(CultureTypes.NeutralCultures),
                      culture => names.Add(culture.Name));
        names.Sort();
        foreach (var name in names)
        {
            // Ignore the invariant culture.
            if (name == "") continue;

            ListSimilarChildCultures(name);
        }
    }

    private static void ListSimilarChildCultures(string name)
    {
        // Create the neutral NumberFormatInfo object.
        NumberFormatInfo nfi = CultureInfo.GetCultureInfo(name).NumberFormat;
        // Retrieve all specific cultures of the neutral culture.
        CultureInfo[] cultures = Array.FindAll(CultureInfo.GetCultures(CultureTypes.SpecificCultures),
                                 culture => culture.Name.StartsWith(name + "-", StringComparison.OrdinalIgnoreCase));
        // Create an array of NumberFormatInfo properties
        PropertyInfo[] properties = typeof(NumberFormatInfo).GetProperties(BindingFlags.Instance | BindingFlags.Public);
        bool hasOneMatch = false;

        foreach (var ci in cultures)
        {
            bool match = true;
            // Get the NumberFormatInfo for a specific culture.
            NumberFormatInfo specificNfi = ci.NumberFormat;
            // Compare the property values of the two.
            foreach (var prop in properties)
            {
                // We're not interested in the value of IsReadOnly.
                if (prop.Name == "IsReadOnly") continue;

                // For arrays, iterate the individual elements to see if they are the same.
                if (prop.PropertyType.IsArray)
                {
                    IList nList = (IList)prop.GetValue(nfi, null);
                    IList sList = (IList)prop.GetValue(specificNfi, null);
                    if (nList.Count != sList.Count)
                    {
                        match = false;
                        break;
                    }

                    for (int ctr = 0; ctr < nList.Count; ctr++)
                    {
                        if (!nList[ctr].Equals(sList[ctr]))
                        {
                            match = false;
                            break;
                        }
                    }
                }
                else if (!prop.GetValue(specificNfi).Equals(prop.GetValue(nfi)))
                {
                    match = false;
                    break;
                }
            }
            if (match)
            {
                Console.WriteLine("NumberFormatInfo object for '{0}' matches '{1}'",
                                          name, ci.Name);
                hasOneMatch = true;
            }
        }
        if (!hasOneMatch)
            Console.WriteLine("NumberFormatInfo object for '{0}' --> No Match", name);

        Console.WriteLine();
    }
}

동적 데이터

클래스에서 제공하는 NumberFormatInfo 숫자 값의 서식을 지정하기 위한 문화권별 데이터는 클래스에서 제공하는 CultureInfo 문화권 데이터와 마찬가지로 동적입니다. 특정 CultureInfo 개체와 연결된 개체에 대한 값의 안정성을 NumberFormatInfo 가정해서는 안 됩니다. 고정 문화권 및 관련 NumberFormatInfo 개체에서 제공하는 데이터만 안정적입니다. 다른 데이터는 애플리케이션 세션 간에 또는 다음과 같은 이유로 단일 세션 내 에서도 변경할 수 있습니다.

  • 시스템 업데이트 통화 기호 또는 통화 형식과 같은 문화권 기본 설정은 시간이 지남에 따라 변경됩니다. 이 경우 Windows 업데이트 특정 문화권의 NumberFormatInfo 속성 값에 대한 변경 내용을 포함합니다.

  • 대체 문화권. 클래스를 CultureAndRegionInfoBuilder 사용하여 기존 문화권의 데이터를 바꿀 수 있습니다.

  • 속성 값에 대한 연속 변경 내용입니다. 여러 문화권 관련 속성은 런타임에 변경되어 데이터가 변경됩니다 NumberFormatInfo . 예를 들어 현재 문화권은 프로그래밍 방식으로 또는 사용자 작업을 통해 변경할 수 있습니다. 이 경우 속성에서 NumberFormatInfo 반환된 개체가 CurrentInfo 현재 문화권과 연결된 개체로 변경됩니다.

  • 사용자 기본 설정. 애플리케이션의 사용자는 제어판에서 국가 및 언어 옵션을 통해 현재 시스템 문화권과 연결 된 값의 일부를 재정의할 수 있습니다. 예를 들어 사용자는 다른 통화 기호 또는 다른 소수 구분 기호를 선택할 수 있습니다. 속성이 CultureInfo.UseUserOverride 기본값으로 true 설정된 경우 개체의 NumberFormatInfo 속성도 사용자 설정에서 검색됩니다.

개체를 만들 때 개체의 모든 사용자 재정의 NumberFormatInfo 가능 속성이 초기화됩니다. 개체 만들기나 사용자 재정의 프로세스가 원자성이 없고 개체를 만드는 동안 관련 값이 변경되기 때문에 여전히 불일치가 발생할 수 있습니다. 그러나 이러한 불일치는 극히 드물어야 합니다.

사용자 재정의가 현재 문화권과 동일한 문화권을 나타내는 개체에 NumberFormatInfo 반영되는지 여부를 제어할 수 있습니다. 다음 표에서는 개체를 NumberFormatInfo 검색할 수 있는 방법을 나열하고 결과 개체가 사용자 재정의를 반영하는지 여부를 나타냅니다.

CultureInfo 및 NumberFormatInfo 개체의 원본 사용자 재정의 반영
CultureInfo.CurrentCulture.NumberFormat 속성
NumberFormatInfo.CurrentInfo 속성
CultureInfo.CreateSpecificCulture 메서드
CultureInfo.GetCultureInfo 메서드 아니요
CultureInfo(String) 생성자
CultureInfo.CultureInfo(String, Boolean) 생성자 매개 변수 값 useUserOverride 에 따라 다름

사용 하는 경우 사용자 재정의가 없는 중요 한 이유가 없는 고려해 야 합니다 NumberFormatInfo 서식을 지정 하 고 사용자 입력을 구문 분석 하거나 숫자 데이터를 표시 하도록 클라이언트 애플리케이션에서 개체입니다. 서버 애플리케이션 또는 무인된 애플리케이션에 대 한 사용자 재정의 하지 고려해 야 합니다. 그러나 개체를 NumberFormatInfo 명시적으로 또는 암시적으로 사용하여 숫자 데이터를 문자열 형식으로 유지하는 경우 고정 문화권의 서식 규칙을 반영하는 개체를 사용 NumberFormatInfo 하거나 문화권에 관계없이 사용하는 사용자 지정 숫자 서식 문자열을 지정해야 합니다.

IFormatProvider, NumberFormatInfo 및 숫자 서식 지정

NumberFormatInfo 개체는 모든 숫자 서식 지정 작업에서 암시적 또는 명시적으로 사용됩니다. 여기에는 다음 메서드에 대한 호출이 포함됩니다.

모든 숫자 서식 지정 작업은 구현을 IFormatProvider 사용합니다. 인터페이스에는 IFormatProvider 단일 메서드가 GetFormat(Type)포함됩니다. 서식 정보를 제공하는 데 필요한 형식을 Type 나타내는 개체를 전달하는 콜백 메서드입니다. 메서드는 해당 형식의 인스턴스를 반환하거나 null형식의 인스턴스를 제공할 수 없는 경우 반환합니다. .NET은 숫자 서식 지정을 위한 두 IFormatProvider 가지 구현을 제공합니다.

형식 지정 메서드에 IFormatProvider 구현이 명시적으로 CultureInfo 제공되지 않으면 현재 문화권을 나타내는 속성에서 CultureInfo.CurrentCulture 반환된 개체가 사용됩니다.

다음 예제에서는 사용자 지정 IFormatProvider 구현을 IFormatProvider 정의하여 형식 지정 작업에서 인터페이스와 NumberFormatInfo 클래스 간의 관계를 보여 줍니다. 해당 GetFormat 메서드는 서식 지정 작업에서 요청한 개체의 형식 이름을 표시합니다. 인터페이스가 개체를 NumberFormatInfo 요청하는 경우 이 메서드는 현재 문화권에 NumberFormatInfo 대한 개체를 제공합니다. 예제의 출력에서 알 Decimal.ToString(IFormatProvider) 수 있듯이 메서드는 개체를 요청 NumberFormatInfo 하여 형식 지정 정보를 제공하는 반면 String.Format(IFormatProvider, String, Object[]) 메서드는 구현뿐만 아니라 요청 NumberFormatInfoDateTimeFormatInfo 개체를 ICustomFormatter 제공합니다.

using System;
using System.Globalization;

public class CurrentCultureFormatProvider : IFormatProvider
{
    public Object GetFormat(Type formatType)
    {
        Console.WriteLine("Requesting an object of type {0}",
                          formatType.Name);
        if (formatType == typeof(NumberFormatInfo))
            return NumberFormatInfo.CurrentInfo;
        else if (formatType == typeof(DateTimeFormatInfo))
            return DateTimeFormatInfo.CurrentInfo;
        else
            return null;
    }
}

public class FormatProviderEx
{
    public static void Main()
    {
        Decimal amount = 1203.541m;
        string value = amount.ToString("C2", new CurrentCultureFormatProvider());
        Console.WriteLine(value);
        Console.WriteLine();
        string composite = String.Format(new CurrentCultureFormatProvider(),
                                         "Date: {0}   Amount: {1}   Description: {2}",
                                         DateTime.Now, 1264.03m, "Service Charge");
        Console.WriteLine(composite);
        Console.WriteLine();
    }
}
// The example displays output like the following:
//    Requesting an object of type NumberFormatInfo
//    $1,203.54
//
//    Requesting an object of type ICustomFormatter
//    Requesting an object of type DateTimeFormatInfo
//    Requesting an object of type NumberFormatInfo
//    Date: 11/15/2012 2:00:01 PM   Amount: 1264.03   Description: Service Charge

IFormatProvider 숫자 서식 지정 메서드 호출에서 구현이 명시적으로 제공되지 않으면 메서드는 현재 문화권에 해당하는 개체를 반환 NumberFormatInfo 하는 메서드를 호출 CultureInfo.CurrentCulture.GetFormat 합니다.

문자열 및 NumberFormatInfo 속성 서식 지정

모든 서식 지정 작업은 표준 또는 사용자 지정 숫자 형식 문자열을 사용하여 숫자에서 결과 문자열을 생성합니다. 경우에 따라 다음 예제와 같이 형식 문자열을 사용하여 결과 문자열을 생성하는 것은 명시적입니다. 이 코드는 Decimal.ToString(IFormatProvider) en-US 문화권의 서식 규칙을 사용하여 값을 다양한 문자열 표현으로 변환 Decimal 하는 메서드를 호출합니다.

using System;
using System.Globalization;

public class PropertiesEx1
{
    public static void Main()
    {
        string[] formatStrings = { "C2", "E1", "F", "G3", "N",
                                 "#,##0.000", "0,000,000,000.0##" };
        CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
        Decimal[] values = { 1345.6538m, 1921651.16m };

        foreach (var value in values)
        {
            foreach (var formatString in formatStrings)
            {
                string resultString = value.ToString(formatString, culture);
                Console.WriteLine("{0,-18} -->  {1}", formatString, resultString);
            }
            Console.WriteLine();
        }
    }
}
// The example displays the following output:
//       C2                 -->  $1,345.65
//       E1                 -->  1.3E+003
//       F                  -->  1345.65
//       G3                 -->  1.35E+03
//       N                  -->  1,345.65
//       #,##0.000          -->  1,345.654
//       0,000,000,000.0##  -->  0,000,001,345.654
//
//       C2                 -->  $1,921,651.16
//       E1                 -->  1.9E+006
//       F                  -->  1921651.16
//       G3                 -->  1.92E+06
//       N                  -->  1,921,651.16
//       #,##0.000          -->  1,921,651.160
//       0,000,000,000.0##  -->  0,001,921,651.16

다른 경우에는 형식 문자열을 사용하는 것이 암시적입니다. 예를 들어 다음 메서드에서 기본 또는 매개 변수 없는 Decimal.ToString() 메서드를 호출할 때 인스턴스 값 Decimal 은 일반("G") 형식 지정자와 현재 문화권의 규칙을 사용하여 형식이 지정됩니다. 이 경우 en-US 문화권입니다.

using System;

public class PropertiesEx2
{
    public static void Main()
    {
        Decimal[] values = { 1345.6538m, 1921651.16m };

        foreach (var value in values)
        {
            string resultString = value.ToString();
            Console.WriteLine(resultString);
            Console.WriteLine();
        }
    }
}
// The example displays the following output:
//       1345.6538
//
//       1921651.16

각 표준 숫자 형식 문자열은 하나 이상의 NumberFormatInfo 속성을 사용하여 결과 문자열에 사용되는 패턴 또는 기호를 결정합니다. 마찬가지로 , "0" 및 "#"을 제외한 각 사용자 지정 숫자 형식 지정자는 속성으로 NumberFormatInfo 정의된 결과 문자열에 기호를 삽입합니다. 다음 표에서는 표준 및 사용자 지정 숫자 형식 지정자와 관련 NumberFormatInfo 속성을 나열합니다. 특정 문화권에 대한 결과 문자열의 모양을 변경하려면 NumberFormatInfo 속성 수정 섹션을 참조하세요. 이러한 형식 지정자의 사용에 대한 자세한 내용은 표준 숫자 형식 문자열 및사용자 지정 숫자 형식 문자열을 참조하세요.

형식 지정자 연결된 속성
"C" 또는 "c"(통화 형식 지정자) CurrencyDecimalDigits- 소수 자릿수의 기본 수를 정의합니다.

CurrencyDecimalSeparator- 10진수 구분 기호를 정의합니다.

CurrencyGroupSeparator- 그룹 또는 천 단위 구분 기호를 정의합니다.

CurrencyGroupSizes- 정수 계열 그룹의 크기를 정의합니다.

CurrencyNegativePattern- 음수 통화 값의 패턴을 정의합니다.

CurrencyPositivePattern- 양수 통화 값의 패턴을 정의합니다.

CurrencySymbol- 통화 기호를 정의합니다.

NegativeSign- 음수 기호를 정의합니다.
"D" 또는 "d"(10진수 형식 지정자) NegativeSign- 음수 기호를 정의합니다.
"E" 또는 "e"(지수 또는 과학 형식 지정자) NegativeSign- 가수 및 지수에서 음수 기호를 정의합니다.

NumberDecimalSeparator- 10진수 구분 기호를 정의합니다.

PositiveSign- 지수에서 양수 기호를 정의합니다.
"F" 또는 "f"(고정 소수점 형식 지정자) NegativeSign- 음수 기호를 정의합니다.

NumberDecimalDigits- 소수 자릿수의 기본 수를 정의합니다.

NumberDecimalSeparator- 10진수 구분 기호를 정의합니다.
"G" 또는 "g"(일반 형식 지정자) NegativeSign- 음수 기호를 정의합니다.

NumberDecimalSeparator- 10진수 구분 기호를 정의합니다.

PositiveSign- 결과 문자열에 대한 양수 기호를 지수 형식으로 정의합니다.
"N" 또는 "n"(숫자 형식 지정자) NegativeSign- 음수 기호를 정의합니다.

NumberDecimalDigits- 소수 자릿수의 기본 수를 정의합니다.

NumberDecimalSeparator- 10진수 구분 기호를 정의합니다.

NumberGroupSeparator- 그룹 구분 기호(천) 기호를 정의합니다.

NumberGroupSizes- 그룹의 정수 자릿수를 정의합니다.

NumberNegativePattern- 음수 값의 형식을 정의합니다.
"P" 또는 "p"(백분율 형식 지정자) NegativeSign- 음수 기호를 정의합니다.

PercentDecimalDigits- 소수 자릿수의 기본 수를 정의합니다.

PercentDecimalSeparator- 10진수 구분 기호를 정의합니다.

PercentGroupSeparator- 그룹 구분 기호를 정의합니다.

PercentGroupSizes- 그룹의 정수 자릿수를 정의합니다.

PercentNegativePattern- 음수 값에 대한 백분율 기호 및 음수 기호의 배치를 정의합니다.

PercentPositivePattern- 양수 값에 대한 백분율 기호의 배치를 정의합니다.

PercentSymbol- 백분율 기호를 정의합니다.
"R" 또는 "r"(왕복 형식 지정자) NegativeSign- 음수 기호를 정의합니다.

NumberDecimalSeparator- 10진수 구분 기호를 정의합니다.

PositiveSign- 지수에서 양수 기호를 정의합니다.
"X" 또는 "x"(16진수 형식 지정자) 없음.
"." (소수점 사용자 지정 형식 지정자) NumberDecimalSeparator- 10진수 구분 기호를 정의합니다.
","(그룹 구분 기호 사용자 지정 형식 지정자) NumberGroupSeparator- 그룹(천 단위) 구분 기호를 정의합니다.
"%"(백분율 자리 표시자 사용자 지정 형식 지정자) PercentSymbol- 백분율 기호를 정의합니다.
"‰"(밀리 단위 자리 표시자 사용자 지정 형식 지정자) PerMilleSymbol- 밀당 기호를 정의합니다.
"E"(지수 표기법 사용자 지정 형식 지정자) NegativeSign- 가수 및 지수에서 음수 기호를 정의합니다.

PositiveSign- 지수에서 양수 기호를 정의합니다.

클래스에는 NumberFormatInfo 특정 문화권에서 NativeDigits 사용하는 기본 10자리 숫자를 지정하는 속성이 포함되어 있습니다. 그러나 이 속성은 서식 지정 작업에 사용되지 않습니다. 결과 문자열에는 기본 라틴 숫자 0(U+0030)에서 9(U+0039)만 사용됩니다. 또한 , 및 Double 값에 대해 결과 문자열은 각각 , PositiveInfinitySymbolNegativeInfinitySymbol 속성에 의해 NaNSymbol정의된 기호로만 구성됩니다.SingleNaNPositiveInfinityNegativeInfinity

NumberFormatInfo 속성 수정

개체의 NumberFormatInfo 속성을 수정하여 숫자 서식 작업에서 생성된 결과 문자열을 사용자 지정할 수 있습니다. 방법:

  1. 서식 규칙을 수정하려는 개체의 NumberFormatInfo 읽기/쓰기 복사본을 만듭니다. 자세한 내용은 NumberFormatInfo 개체 인스턴스화 섹션을 참조하세요.

  2. 원하는 결과 문자열을 생성하는 데 사용되는 속성 또는 속성을 수정합니다. 서식 지정 메서드가 속성을 사용하여 NumberFormatInfo 결과 문자열을 정의하는 방법에 대한 자세한 내용은 문자열 서식 및 NumberFormatInfo 속성 섹션을 참조하세요.

  3. 형식 지정 메서드 호출 IFormatProvider 에서 사용자 지정 NumberFormatInfo 개체를 인수로 사용합니다.

참고 항목

애플리케이션이 시작 될 때마다는 문화권의 속성 값을 동적으로 수정 하는 대신 사용할 수는 CultureAndRegionInfoBuilder (고유 이름을 가진 및 기존 문화권을 보완 하는 문화권) 사용자 지정 문화권 또는 대체를 정의 하는 클래스 (하나는 특정 문화권 대신 사용 되는) 문화권입니다.

다음 섹션에서는 몇 가지 예를 제공합니다.

통화 기호 및 패턴 수정

다음 예제에서는 en-US 문화권의 서식 규칙을 나타내는 개체를 수정 NumberFormatInfo 합니다. ISO-4217 통화 기호를 CurrencySymbol 속성에 할당하고 통화 기호와 공백 및 숫자 값으로 구성된 통화 값의 패턴을 정의합니다.

using System;
using System.Globalization;

public class Example
{
    public static void Main()
    {
        // Retrieve a writable NumberFormatInfo object.
        CultureInfo enUS = CultureInfo.CreateSpecificCulture("en-US");
        NumberFormatInfo nfi = enUS.NumberFormat;

        // Use the ISO currency symbol instead of the native currency symbol.
        nfi.CurrencySymbol = (new RegionInfo(enUS.Name)).ISOCurrencySymbol;
        // Change the positive currency pattern to <code><space><value>.
        nfi.CurrencyPositivePattern = 2;
        // Change the negative currency pattern to <code><space><sign><value>.
        nfi.CurrencyNegativePattern = 12;

        // Produce the result strings by calling ToString.
        Decimal[] values = { 1065.23m, 19.89m, -.03m, -175902.32m };
        foreach (var value in values)
            Console.WriteLine(value.ToString("C", enUS));

        Console.WriteLine();

        // Produce the result strings by calling a composite formatting method.
        foreach (var value in values)
            Console.WriteLine(String.Format(enUS, "{0:C}", value));
    }
}
// The example displays the following output:
//       USD 1,065.23
//       USD 19.89
//       USD -0.03
//       USD -175,902.32
//
//       USD 1,065.23
//       USD 19.89
//       USD -0.03
//       USD -175,902.32

국가 식별 번호 서식 지정

많은 국가 식별 번호는 숫자로만 구성되므로 개체의 NumberFormatInfo 속성을 수정하여 쉽게 서식을 지정할 수 있습니다. 예를 들어 미국 사회 보장 번호는 다음과 같이 정렬된 9자리 숫자로 구성됩니다XXX-XX-XXXX. 다음 예제에서는 사회 보장 번호가 정수 값으로 저장되고 적절하게 서식을 지정한다고 가정합니다.

using System;
using System.Globalization;

public class CustomizeSSNEx
{
    public static void Main()
    {
        // Instantiate a read-only NumberFormatInfo object.
        CultureInfo enUS = CultureInfo.CreateSpecificCulture("en-US");
        NumberFormatInfo nfi = enUS.NumberFormat;

        // Modify the relevant properties.
        nfi.NumberGroupSeparator = "-";
        nfi.NumberGroupSizes = new int[] { 3, 2, 4 };
        nfi.NumberDecimalDigits = 0;

        int[] ids = { 111223333, 999776666 };

        // Produce the result string by calling ToString.
        foreach (var id in ids)
            Console.WriteLine(id.ToString("N", enUS));

        Console.WriteLine();

        // Produce the result string using composite formatting.
        foreach (var id in ids)
            Console.WriteLine(String.Format(enUS, "{0:N}", id));
    }
}
// The example displays the following output:
//       1112-23-333
//       9997-76-666
//
//       1112-23-333
//       9997-76-666

숫자 문자열 구문 분석

구문 분석에서는 숫자의 문자열 표현을 숫자로 변환합니다. .NET의 각 숫자 형식에는 두 개의 오버로드된 구문 분석 메서드 Parse 가 포함됩니다 TryParse. 이 메서드는 Parse 문자열을 숫자로 변환하고 변환에 실패하면 예외를 throw합니다. 이 메서드는 TryParse 문자열을 숫자로 변환하고, 숫자를 인수에 out 할당하고, 변환이 성공했는지 여부를 나타내는 값을 반환 Boolean 합니다.

구문 분석 메서드는 열거형 값을 암시적으로 또는 명시적으로 사용하여 NumberStyles 구문 분석 작업이 성공하는 경우 문자열에 있을 수 있는 스타일 요소(예: 그룹 구분 기호, 소수 구분 기호 또는 통화 기호)를 결정합니다. NumberStyles 메서드 호출에 값이 제공되지 않으면 기본값은 NumberStyles 구문 분석된 문자열에 그룹 기호, 소수 구분 기호, 음수 기호 및 공백 문자를 포함하거나 지수 표기법으로 숫자의 문자열 표현이 될 수 있음을 지정하는 및 플래그를 포함하는 FloatAllowThousands 값입니다.

구문 분석 메서드는 구문 분석할 문자열에서 발생할 수 있는 특정 기호 및 패턴을 정의하는 개체를 암시적으로 또는 명시적으로 사용합니다 NumberFormatInfo . 개체가 NumberFormatInfo 제공되지 않으면 기본값은 현재 문화권의 기본값입니다 NumberFormatInfo . 구문 분석에 대한 자세한 내용은 개별 구문 분석 메서드(예: Int16.Parse(String), Int32.Parse(String, NumberStyles), Int64.Parse(String, IFormatProvider), Decimal.Parse(String, NumberStyles, IFormatProvider)Double.TryParse(String, Double)BigInteger.TryParse(String, NumberStyles, IFormatProvider, BigInteger))를 참조하세요.

다음 예제에서는 구문 분석 문자열의 문화권 구분 특성을 보여 줍니다. en-US, fr-FR 및 고정 문화권의 규칙을 사용하여 수천 개의 구분 기호를 포함하는 문자열을 구문 분석하려고 합니다. 쉼표가 그룹 구분 기호로 포함되고 소수 구분 기호로 마침표가 fr-FR 문화권에서 구문 분석되지 못하고 공백이 그룹 구분 기호로, 쉼표가 10진수 구분 기호인 문자열은 en-US 및 고정 문화권에서 구문 분석에 실패합니다.

using System;
using System.Globalization;

public class ParseEx1
{
    public static void Main()
    {
        String[] values = { "1,034,562.91", "9 532 978,07" };
        String[] cultureNames = { "en-US", "fr-FR", "" };

        foreach (var value in values)
        {
            foreach (var cultureName in cultureNames)
            {
                CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
                String name = culture.Name == "" ? "Invariant" : culture.Name;
                try
                {
                    Decimal amount = Decimal.Parse(value, culture);
                    Console.WriteLine("'{0}' --> {1} ({2})", value, amount, name);
                }
                catch (FormatException)
                {
                    Console.WriteLine("'{0}': FormatException ({1})",
                                      value, name);
                }
            }
            Console.WriteLine();
        }
    }
}
// The example displays the following output:
//       '1,034,562.91' --> 1034562.91 (en-US)
//       '1,034,562.91': FormatException (fr-FR)
//       '1,034,562.91' --> 1034562.91 (Invariant)
//
//       '9 532 978,07': FormatException (en-US)
//       '9 532 978,07' --> 9532978.07 (fr-FR)
//       '9 532 978,07': FormatException (Invariant)

구문 분석은 일반적으로 다음 두 가지 컨텍스트에서 발생합니다.

  • 사용자 입력을 숫자 값으로 변환하도록 설계된 작업입니다.

  • 숫자 값을 왕복하도록 설계된 연산으로, 즉, 이전에 문자열로 serialize된 숫자 값을 역직렬화합니다.

다음 섹션에서는 이러한 두 작업에 대해 자세히 설명합니다.

사용자 문자열 구문 분석

사용자가 입력한 숫자 문자열을 구문 분석할 때는 항상 사용자의 문화권 설정을 반영하는 개체를 인스턴스화 NumberFormatInfo 해야 합니다. 사용자 사용자 지정을 반영하는 개체를 NumberFormatInfo 인스턴스화하는 방법에 대한 자세한 내용은 동적 데이터 섹션을 참조하세요.

다음 예제에서는 사용자 문화권 설정을 반영하는 구문 분석 작업과 그렇지 않은 구문 분석 작업의 차이점을 보여 줍니다. 이 경우 기본 시스템 문화권은 en-US이지만 사용자는 ""를 10진수 기호로, "."를 제어판, 지역 및 언어의 그룹 구분 기호로 정의했습니다. 일반적으로 이러한 기호는 기본 en-US 문화권에서 반전됩니다. 사용자가 사용자 설정을 반영하는 문자열을 입력하고 사용자 설정(재정의)도 반영하는 개체에 의해 NumberFormatInfo 문자열을 구문 분석하면 구문 분석 작업이 올바른 결과를 반환합니다. 그러나 문자열이 표준 en-US culture 설정을 반영하는 개체에 의해 NumberFormatInfo 구문 분석되는 경우 그룹 구분 기호에 대한 쉼표 기호를 실수하고 잘못된 결과를 반환합니다.

using System;
using System.Globalization;

public class ParseUserEx
{
    public static void Main()
    {
        CultureInfo stdCulture = CultureInfo.GetCultureInfo("en-US");
        CultureInfo custCulture = CultureInfo.CreateSpecificCulture("en-US");

        String value = "310,16";
        try
        {
            Console.WriteLine("{0} culture reflects user overrides: {1}",
                              stdCulture.Name, stdCulture.UseUserOverride);
            Decimal amount = Decimal.Parse(value, stdCulture);
            Console.WriteLine("'{0}' --> {1}", value, amount.ToString(CultureInfo.InvariantCulture));
        }
        catch (FormatException)
        {
            Console.WriteLine("Unable to parse '{0}'", value);
        }
        Console.WriteLine();

        try
        {
            Console.WriteLine("{0} culture reflects user overrides: {1}",
                              custCulture.Name, custCulture.UseUserOverride);
            Decimal amount = Decimal.Parse(value, custCulture);
            Console.WriteLine("'{0}' --> {1}", value, amount.ToString(CultureInfo.InvariantCulture));
        }
        catch (FormatException)
        {
            Console.WriteLine("Unable to parse '{0}'", value);
        }
    }
}
// The example displays the following output:
//       en-US culture reflects user overrides: False
//       '310,16' --> 31016
//
//       en-US culture reflects user overrides: True
//       '310,16' --> 310.16

숫자 데이터 직렬화 및 역직렬화

숫자 데이터가 문자열 형식으로 직렬화되고 나중에 역직렬화되고 구문 분석되는 경우 고정 문화권의 규칙을 사용하여 문자열을 생성하고 구문 분석해야 합니다. 서식 지정 및 구문 분석 작업은 특정 문화권의 규칙을 반영해서는 안 됩니다. 문화권별 설정을 사용하는 경우 데이터의 이식성이 엄격하게 제한됩니다. 문화권별 설정이 serialize된 스레드의 설정과 동일한 스레드에서만 역직렬화할 수 있습니다. 경우에 따라 데이터가 직렬화된 동일한 시스템에서 데이터를 역직렬화할 수도 없습니다.

다음 예제에서는 이 원칙을 위반할 때 발생할 수 있는 작업을 보여 줍니다. 현재 스레드가 en-US 문화권의 문화권별 설정을 사용하는 경우 배열의 부동 소수점 값이 문자열로 변환됩니다. 그런 다음 pt-BR 문화권의 문화권별 설정을 사용하는 스레드를 통해 데이터를 구문 분석합니다. 이 경우 각 구문 분석 작업이 성공하지만 데이터가 왕복에 성공하지 못하고 데이터 손상이 발생합니다. 다른 경우에는 구문 분석 작업이 실패하고 예외가 FormatException throw될 수 있습니다.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Threading;

public class ParsePersistedEx
{
    public static void Main()
    {
        CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
        PersistData();

        CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("pt-BR");
        RestoreData();
    }

    private static void PersistData()
    {
        // Define an array of floating-point values.
        Double[] values = { 160325.972, 8631.16, 1.304e5, 98017554.385,
                          8.5938287084321676e94 };
        Console.WriteLine("Original values: ");
        foreach (var value in values)
            Console.WriteLine(value.ToString("R", CultureInfo.InvariantCulture));

        // Serialize an array of doubles to a file
        StreamWriter sw = new StreamWriter(@".\NumericData.bin");
        for (int ctr = 0; ctr < values.Length; ctr++)
        {
            sw.Write(values[ctr].ToString("R"));
            if (ctr < values.Length - 1) sw.Write("|");
        }
        sw.Close();
        Console.WriteLine();
    }

    private static void RestoreData()
    {
        // Deserialize the data
        StreamReader sr = new StreamReader(@".\NumericData.bin");
        String data = sr.ReadToEnd();
        sr.Close();

        String[] stringValues = data.Split('|');
        List<Double> newValueList = new List<Double>();

        foreach (var stringValue in stringValues)
        {
            try
            {
                newValueList.Add(Double.Parse(stringValue));
            }
            catch (FormatException)
            {
                newValueList.Add(Double.NaN);
            }
        }

        Console.WriteLine("Restored values:");
        foreach (var newValue in newValueList)
            Console.WriteLine(newValue.ToString("R", NumberFormatInfo.InvariantInfo));
    }
}
// The example displays the following output:
//       Original values:
//       160325.972
//       8631.16
//       130400
//       98017554.385
//       8.5938287084321671E+94
//
//       Restored values:
//       160325972
//       863116
//       130400
//       98017554385
//       8.5938287084321666E+110