.NET での数値文字列の解析Parsing Numeric Strings in NET

すべての数値型には、2 つの静的解析メソッド (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 メソッドは、10 進数の整数を含む文字列を整数値のみに正常に変換することができます。By default, the Parse and TryParse methods can successfully convert strings that contain integral decimal digits only to integer values. これらのメソッドは、整数部と小数部、グループ区切り、および小数点記号を含む文字列を浮動小数点値に正常に変換できます。They can successfully convert strings that contain integral and fractional decimal digits, group separators, and a decimal separator to floating-point values. TryParse メソッドが false を返すのに対して、Parse メソッドは操作が失敗した場合に例外をスローします。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.CurrentInfo プロパティで返された NumberFormatInfo オブジェクト) と関連付けられた書式プロバイダーが使用されます。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. このインターフェイスには、1 つのメンバー (GetFormat メソッド) があり、その 1 つのパラメーターは、書式設定される型を示す 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 では、数値文字列を解析するために、次の 2 つの 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 をスローする場合、フランス語 (フランス) カルチャの規則を反映する書式プロバイダーを使用して、文字列を解析しようとしています。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.Float 値と NumberStyles.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. NumberStyles 型のパラメーターを含む、Parse または TryParse メソッドのオーバーロードを呼び出し、1 つ以上の 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.Parse(String) メソッドを使用して、Int32 値に変換することはできません。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.AllowLeadingWhiteNumberStyles.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.AllowLeadingWhiteNumberStyles.AllowTrailingWhiteNumberStyles.AllowLeadingSignNumberStyles.AllowTrailingSignNumberStyles.AllowDecimalPointNumberStyles.AllowThousands スタイルが含まれます。Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowTrailingSign, NumberStyles.AllowDecimalPoint, and NumberStyles.AllowThousands styles.
NumberStyles.Float NumberStyles.AllowLeadingWhiteNumberStyles.AllowTrailingWhiteNumberStyles.AllowLeadingSignNumberStyles.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.AllowLeadingWhiteNumberStyles.AllowTrailingWhiteNumberStyles.AllowHexSpecifier スタイルが含まれます。Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, and NumberStyles.AllowHexSpecifier styles.

解析と Unicode 数字Parsing and Unicode Digits

Unicode 標準では、さまざまな書記体系で数字のコード ポイントを定義します。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 をスローします。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