.NET에서 숫자 문자열 구문 분석Parsing Numeric Strings in NET

모든 숫자 형식에는 두 개의 정적 구문 분석 메서드인 ParseTryParse가 있습니다. 이를 사용하여 숫자의 문자열 표현을 숫자 형식으로 변환할 수 있습니다.All numeric types have two static parsing methods, Parse and TryParse, that you can use to convert the string representation of a number into a numeric type. 이러한 메서드를 사용하면 표준 숫자 서식 문자열사용자 지정 숫자 서식 문자열에서 설명하는 서식 문자열을 사용하여 생성된 문자열을 구문 분석할 수 있습니다.These methods enable you to parse strings that were produced by using the format strings documented in Standard Numeric Format Strings and Custom Numeric Format Strings. 기본적으로 ParseTryParse 메서드는 정수 소수 자릿수를 포함하는 문자열을 정수 값으로 변환할 수 있습니다.By default, the Parse and TryParse methods can successfully convert strings that contain integral decimal digits only to integer values. 정수 및 소수 10진수 숫자, 그룹 구분 기호 및 소수 구분 기호를 포함하는 문자열을 부동 소수점 값으로 성공적으로 변환할 수 있습니다.They can successfully convert strings that contain integral and fractional decimal digits, group separators, and a decimal separator to floating-point values. 작업에 실패하면 Parse 메서드는 예외를 throw하지만 TryParse 메서드는 false를 반환합니다.The Parse method throws an exception if the operation fails, whereas the TryParse method returns false.

구문 분석 및 서식 공급자Parsing and Format Providers

일반적으로 숫자 값의 문자열 표현은 문화권마다 다릅니다.Typically, the string representations of numeric values differ by culture. 통화 기호, 그룹(또는 천 단위 자리) 구분 기호 및 소수 구분 기호와 같은 숫자 문자열의 요소는 모두 문화권마다 다릅니다.Elements of numeric strings such as currency symbols, group (or thousands) separators, and decimal separators all vary by culture. 구문 분석 메서드는 이러한 문화권별 차이를 인식하는 서식 공급자를 암시적 또는 명시적으로 사용합니다.Parsing methods either implicitly or explicitly use a format provider that recognizes these culture-specific variations. 형식 공급자가 Parse 또는 TryParse 메서드에 대한 호출에서 지정되지 않은 경우 현재 스레드 문화권과 연결된 형식 공급자(NumberFormatInfo 속성에서 반환한 NumberFormatInfo.CurrentInfo 개체)가 사용됩니다.If no format provider is specified in a call to the Parse or TryParse method, the format provider associated with the current thread culture (the NumberFormatInfo object returned by the NumberFormatInfo.CurrentInfo property) is used.

형식 공급자는 IFormatProvider 구현으로 나타납니다.A format provider is represented by an IFormatProvider implementation. 이 인터페이스에는 단일 멤버인 GetFormat 메서드가 있으며, 이 메서드의 단일 매개 변수는 서식을 지정할 형식을 나타내는 Type 개체입니다.This interface has a single member, the GetFormat method, whose single parameter is a Type object that represents the type to be formatted. 이 메서드는 서식 지정 정보를 제공하는 개체를 반환합니다.This method returns the object that provides formatting information. .NET에서는 숫자 문자열을 구문 분석하기 위해 다음과 같은 두 가지 IFormatProvider 구현을 지원합니다..NET supports the following two IFormatProvider implementations for parsing numeric strings:

다음 예제에서는 배열의 각 문자열을 Double 값으로 변환하려고 합니다.The following example tries to convert each string in an array to a Double value. 먼저 영어(미국) 문화권의 규칙을 반영하는 서식 공급자를 사용하여 문자열을 구문 분석하려고 합니다.It first tries to parse the string by using a format provider that reflects the conventions of the English (United States) culture. 이 작업에서 FormatException을 throw하는 경우 프랑스어(프랑스) 문화권의 규칙을 반영하는 형식 공급자를 사용하여 문자열을 구문 분석하려고 합니다.If this operation throws a FormatException, it tries to parse the string by using a format provider that reflects the conventions of the French (France) culture.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      string[] values = { "1,304.16", "$1,456.78", "1,094", "152", 
                          "123,45 €", "1 304,16", "Ae9f" };
      double number;
      CultureInfo culture = null;
      
      foreach (string value in values) {
         try {
            culture = CultureInfo.CreateSpecificCulture("en-US");
            number = Double.Parse(value, culture);
            Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number);
         }   
         catch (FormatException) {
            Console.WriteLine("{0}: Unable to parse '{1}'.", 
                              culture.Name, value);
            culture = CultureInfo.CreateSpecificCulture("fr-FR");
            try {
               number = Double.Parse(value, culture);
               Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number);
            }
            catch (FormatException) {
               Console.WriteLine("{0}: Unable to parse '{1}'.", 
                                 culture.Name, value);
            }
         }
         Console.WriteLine();
      }   
   }
}
// The example displays the following output:
//    en-US: 1,304.16 --> 1304.16
//    
//    en-US: Unable to parse '$1,456.78'.
//    fr-FR: Unable to parse '$1,456.78'.
//    
//    en-US: 1,094 --> 1094
//    
//    en-US: 152 --> 152
//    
//    en-US: Unable to parse '123,45 €'.
//    fr-FR: Unable to parse '123,45 €'.
//    
//    en-US: Unable to parse '1 304,16'.
//    fr-FR: 1 304,16 --> 1304.16
//    
//    en-US: Unable to parse 'Ae9f'.
//    fr-FR: Unable to parse 'Ae9f'.
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim values() As String = { "1,304.16", "$1,456.78", "1,094", "152", 
                                 "123,45 €", "1 304,16", "Ae9f" }
      Dim number As Double
      Dim culture As CultureInfo = Nothing
      
      For Each value As String In values
         Try
            culture = CultureInfo.CreateSpecificCulture("en-US")
            number = Double.Parse(value, culture)
            Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number)
         Catch e As FormatException
            Console.WriteLine("{0}: Unable to parse '{1}'.", 
                              culture.Name, value)
            culture = CultureInfo.CreateSpecificCulture("fr-FR")
            Try
               number = Double.Parse(value, culture)
               Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number)
            Catch ex As FormatException
               Console.WriteLine("{0}: Unable to parse '{1}'.", 
                                 culture.Name, value)
            End Try
         End Try
         Console.WriteLine()
      Next
   End Sub
End Module
' The example displays the following output:
'    en-US: 1,304.16 --> 1304.16
'    
'    en-US: Unable to parse '$1,456.78'.
'    fr-FR: Unable to parse '$1,456.78'.
'    
'    en-US: 1,094 --> 1094
'    
'    en-US: 152 --> 152
'    
'    en-US: Unable to parse '123,45 €'.
'    fr-FR: Unable to parse '123,45 €'.
'    
'    en-US: Unable to parse '1 304,16'.
'    fr-FR: 1 304,16 --> 1304.16
'    
'    en-US: Unable to parse 'Ae9f'.
'    fr-FR: Unable to parse 'Ae9f'.

구문 분석 및 NumberStyles 값Parsing and NumberStyles Values

구문 분석 작업이 처리할 수 있는 스타일 요소(예: 공백, 그룹 구분 기호 및 소수 구분 기호)는 NumberStyles 열거형 값으로 정의됩니다.The style elements (such as white space, group separators, and decimal separator) that the parse operation can handle are defined by a NumberStyles enumeration value. 기본적으로 정수 값을 나타내는 문자열은 숫자, 선행 및 후행 공백 및 선행 기호만을 허용하는 NumberStyles.Integer 값을 사용하여 구문 분석됩니다.By default, strings that represent integer values are parsed by using the NumberStyles.Integer value, which permits only numeric digits, leading and trailing white space, and a leading sign. 부동 소수점 값을 나타내는 문자열은 NumberStyles.FloatNumberStyles.AllowThousands 값의 조합을 사용하여 구문 분석됩니다. 이 복합 스타일은 선행 및 후행 공백, 선행 기호, 소수 구분 기호, 그룹 구분 기호 및 지수와 함께 10진수 숫자를 허용합니다.Strings that represent floating-point values are parsed using a combination of the NumberStyles.Float and NumberStyles.AllowThousands values; this composite style permits decimal digits along with leading and trailing white space, a leading sign, a decimal separator, a group separator, and an exponent. 구문 분석 작업에 성공하기 위해 Parse 형식의 매개 변수를 포함하는 TryParse 또는 NumberStyles 메서드의 오버로드를 호출하고 NumberStyles 플래그를 하나 이상 설정하여 문자열에 나타낼 수 있는 스타일 요소를 제어할 수 있습니다.By calling an overload of the Parse or TryParse method that includes a parameter of type NumberStyles and setting one or more NumberStyles flags, you can control the style elements that can be present in the string for the parse operation to succeed.

예를 들어 그룹 구분 기호를 포함하는 문자열은 Int32 메서드를 사용하여 Int32.Parse(String) 값으로 변환할 수 없지만,For example, a string that contains a group separator cannot be converted to an Int32 value by using the Int32.Parse(String) method. 다음 예제에서 설명하는 것처럼 NumberStyles.AllowThousands 플래그를 사용할 경우 변환이 성공합니다.However, the conversion succeeds if you use the NumberStyles.AllowThousands flag, as the following example illustrates.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      string value = "1,304";
      int number;
      IFormatProvider provider = CultureInfo.CreateSpecificCulture("en-US");
      if (Int32.TryParse(value, out number))
         Console.WriteLine("{0} --> {1}", value, number);
      else
         Console.WriteLine("Unable to convert '{0}'", value);
            
      if (Int32.TryParse(value, NumberStyles.Integer | NumberStyles.AllowThousands, 
                        provider, out number))
         Console.WriteLine("{0} --> {1}", value, number);
      else
         Console.WriteLine("Unable to convert '{0}'", value);
   }
}
// The example displays the following output:
//       Unable to convert '1,304'
//       1,304 --> 1304
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim value As String = "1,304"
      Dim number As Integer
      Dim provider As IFormatProvider = CultureInfo.CreateSpecificCulture("en-US")
      If Int32.TryParse(value, number) Then
         Console.WriteLine("{0} --> {1}", value, number)
      Else
         Console.WriteLine("Unable to convert '{0}'", value)
      End If
            
      If Int32.TryParse(value, NumberStyles.Integer Or NumberStyles.AllowThousands, 
                        provider, number) Then
         Console.WriteLine("{0} --> {1}", value, number)
      Else
         Console.WriteLine("Unable to convert '{0}'", value)
      End If
   End Sub
End Module
' The example displays the following output:
'       Unable to convert '1,304'
'       1,304 --> 1304

경고

구문 분석 작업은 항상 특정 문화권의 서식 지정 규칙을 사용합니다.The parse operation always uses the formatting conventions of a particular culture. CultureInfo 또는 NumberFormatInfo 개체를 전달하여 문화권을 지정하지 않는 경우 현재 스레드와 관련된 문화권이 사용됩니다.If you do not specify a culture by passing a CultureInfo or NumberFormatInfo object, the culture associated with the current thread is used.

다음 표에서는 NumberStyles 열거형의 멤버를 나열하고 구문 분석 작업에 미치는 영향에 대해 설명합니다.The following table lists the members of the NumberStyles enumeration and describes the effect that they have on the parsing operation.

NumberStyles 값NumberStyles value 구문 분석할 문자열에 미치는 영향Effect on the string to be parsed
NumberStyles.None 숫자만 허용됩니다.Only numeric digits are permitted.
NumberStyles.AllowDecimalPoint 소수 구분 기호 및 소수 자릿수가 허용됩니다.The decimal separator and fractional digits are permitted. 정수 값의 경우 소수 자릿수로 0만 허용됩니다.For integer values, only zero is permitted as a fractional digit. 유효한 소수 구분 기호는 NumberFormatInfo.NumberDecimalSeparator 또는 NumberFormatInfo.CurrencyDecimalSeparator 속성으로 결정됩니다.Valid decimal separators are determined by the NumberFormatInfo.NumberDecimalSeparator or NumberFormatInfo.CurrencyDecimalSeparator property.
NumberStyles.AllowExponent 지수 표기법을 나타내기 위해 "e" 또는 "E" 문자를 사용할 수 있습니다.The "e" or "E" character can be used to indicate exponential notation. 자세한 내용은 NumberStyles를 참조하세요.See NumberStyles for additional information.
NumberStyles.AllowLeadingWhite 선행 공백이 허용됩니다.Leading white space is permitted.
NumberStyles.AllowTrailingWhite 후행 공백이 허용됩니다.Trailing white space is permitted.
NumberStyles.AllowLeadingSign 양수 또는 음수 기호를 숫자 앞에 둘 수 있습니다.A positive or negative sign can precede numeric digits.
NumberStyles.AllowTrailingSign 양수 또는 음수 기호를 숫자 뒤에 둘 수 있습니다.A positive or negative sign can follow numeric digits.
NumberStyles.AllowParentheses 괄호는 음수 값을 나타내는 데 사용될 수 있습니다.Parentheses can be used to indicate negative values.
NumberStyles.AllowThousands 그룹 구분 기호가 허용됩니다.The group separator is permitted. 그룹 구분 문자는 NumberFormatInfo.NumberGroupSeparator 또는 NumberFormatInfo.CurrencyGroupSeparator 속성으로 결정됩니다.The group separator character is determined by the NumberFormatInfo.NumberGroupSeparator or NumberFormatInfo.CurrencyGroupSeparator property.
NumberStyles.AllowCurrencySymbol 통화 기호가 허용됩니다.The currency symbol is permitted. 통화 기호는 NumberFormatInfo.CurrencySymbol 속성으로 정의됩니다.The currency symbol is defined by the NumberFormatInfo.CurrencySymbol property.
NumberStyles.AllowHexSpecifier 구문 분석될 문자열은 16진수 숫자로 해석됩니다.The string to be parsed is interpreted as a hexadecimal number. 16진수인 0-9, A-F 및 a-f를 포함할 수 있습니다.It can include the hexadecimal digits 0-9, A-F, and a-f. 이 플래그는 정수 값을 구문 분석하는 데 사용할 수 있습니다.This flag can be used only to parse integer values.

또한 NumberStyles 열거형은 다중 NumberStyles 플래그를 포함하는 다음과 같은 복합 스타일을 제공합니다.In addition, the NumberStyles enumeration provides the following composite styles, which include multiple NumberStyles flags.

복합 NumberStyles 값Composite NumberStyles value 구성원 포함Includes members
NumberStyles.Integer NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhiteNumberStyles.AllowLeadingSign 스타일을 포함합니다.Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, and NumberStyles.AllowLeadingSign styles. 정수 값을 구문 분석하는 데 사용되는 기본 스타일입니다.This is the default style used to parse integer values.
NumberStyles.Number NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowTrailingSign, NumberStyles.AllowDecimalPointNumberStyles.AllowThousands 스타일을 포함합니다.Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowTrailingSign, NumberStyles.AllowDecimalPoint, and NumberStyles.AllowThousands styles.
NumberStyles.Float NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowDecimalPointNumberStyles.AllowExponent 스타일을 포함합니다.Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowDecimalPoint, and NumberStyles.AllowExponent styles.
NumberStyles.Currency NumberStyles.AllowExponentNumberStyles.AllowHexSpecifier를 제외한 모든 스타일을 포함합니다.Includes all styles except NumberStyles.AllowExponent and NumberStyles.AllowHexSpecifier.
NumberStyles.Any NumberStyles.AllowHexSpecifier를 제외한 모든 스타일을 포함합니다.Includes all styles except NumberStyles.AllowHexSpecifier.
NumberStyles.HexNumber NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhiteNumberStyles.AllowHexSpecifier 스타일을 포함합니다.Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, and NumberStyles.AllowHexSpecifier styles.

구문 분석 및 유니코드 숫자Parsing and Unicode Digits

유니코드 표준은 다양한 문자 체계의 숫자에 대한 코드 포인트를 정의합니다.The Unicode standard defines code points for digits in various writing systems. 예를 들어 U+0030에서 U+0039의 코드 포인트는 기본 라틴어 숫자 0부터 9까지를 나타내며, U+09E6에서 U+09EF의 코드 포인트는 벵골어 숫자 0부터 9까지, U+FF10에서 U+FF19의 코드 포인트는 전자 숫자 0부터 9까지를 나타냅니다.For example, code points from U+0030 to U+0039 represent the basic Latin digits 0 through 9, code points from U+09E6 to U+09EF represent the Bangla digits 0 through 9, and code points from U+FF10 to U+FF19 represent the Fullwidth digits 0 through 9. 그러나 메서드를 구문 분석하여 인식되는 숫자 자릿수는 U +0030에서 U +0039까지의 코드 포인트를 가진 기본 라틴어 숫자 0-9입니다.However, the only numeric digits recognized by parsing methods are the basic Latin digits 0-9 with code points from U+0030 to U+0039. 숫자 구문 분석 메서드가 여타의 숫자가 포함된 문자열을 전달받은 경우 이 메서드는 FormatException을 throw합니다.If a numeric parsing method is passed a string that contains any other digits, the method throws a FormatException.

다음 예제에서는 Int32.Parse 메서드를 사용하여 다양한 표기 체계의 숫자로 구성된 문자열을 구문 분석합니다.The following example uses the Int32.Parse method to parse strings that consist of digits in different writing systems. 이 예제의 결과에서와 같이 기본 라틴어 숫자에 대한 구문 분석 시도는 성공하지만 전자, 아랍어-인도어, 벵골어 숫자에 대한 구문 분석 시도는 실패합니다.As the output from the example shows, the attempt to parse the basic Latin digits succeeds, but the attempt to parse the Fullwidth, Arabic-Indic, and Bangla digits fails.

using System;

public class Example
{
   public static void Main()
   {
      string value;
      // Define a string of basic Latin digits 1-5.
      value = "\u0031\u0032\u0033\u0034\u0035";
      ParseDigits(value);

      // Define a string of Fullwidth digits 1-5.
      value = "\uFF11\uFF12\uFF13\uFF14\uFF15";
      ParseDigits(value);
      
      // Define a string of Arabic-Indic digits 1-5.
      value = "\u0661\u0662\u0663\u0664\u0665";
      ParseDigits(value);
      
      // Define a string of Bangla digits 1-5.
      value = "\u09e7\u09e8\u09e9\u09ea\u09eb";
      ParseDigits(value);
   }

   static void ParseDigits(string value)
   {
      try {
         int number = Int32.Parse(value);
         Console.WriteLine("'{0}' --> {1}", value, number);
      }   
      catch (FormatException) {
         Console.WriteLine("Unable to parse '{0}'.", value);      
      }     
   }
}
// The example displays the following output:
//       '12345' --> 12345
//       Unable to parse '12345'.
//       Unable to parse '١٢٣٤٥'.
//       Unable to parse '১২৩৪৫'.
Module Example
   Public Sub Main()
      Dim value As String
      ' Define a string of basic Latin digits 1-5.
      value = ChrW(&h31) + ChrW(&h32) + ChrW(&h33) + ChrW(&h34) + ChrW(&h35)
      ParseDigits(value)

      ' Define a string of Fullwidth digits 1-5.
      value = ChrW(&hff11) + ChrW(&hff12) + ChrW(&hff13) + ChrW(&hff14) + ChrW(&hff15)
      ParseDigits(value)
      
      ' Define a string of Arabic-Indic digits 1-5.
      value = ChrW(&h661) + ChrW(&h662) + ChrW(&h663) + ChrW(&h664) + ChrW(&h665)
      ParseDigits(value)
      
      ' Define a string of Bangla digits 1-5.
      value = ChrW(&h09e7) + ChrW(&h09e8) + ChrW(&h09e9) + ChrW(&h09ea) + ChrW(&h09eb)
      ParseDigits(value)
   End Sub

   Sub ParseDigits(value As String)
      Try
         Dim number As Integer = Int32.Parse(value)
         Console.WriteLine("'{0}' --> {1}", value, number)
      Catch e As FormatException
         Console.WriteLine("Unable to parse '{0}'.", value)      
      End Try     
   End Sub
End Module
' The example displays the following output:
'       '12345' --> 12345
'       Unable to parse '12345'.
'       Unable to parse '١٢٣٤٥'.
'       Unable to parse '১২৩৪৫'.

참고 항목See also