Analizowanie ciągów liczbowych w sieciParsing Numeric Strings in NET

Wszystkie typy liczbowe mają dwie metody statycznej analizy Parse i TryParse , których można użyć do przekonwertowania ciągu reprezentującego liczbę do typu liczbowego.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. Te metody umożliwiają analizowanie ciągów, które zostały utworzone za pomocą ciągów formatu udokumentowanych w standardowych ciągach formatu liczbowego i niestandardowych ciągów formatu liczbowego.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. Domyślnie Parse TryParse metody i mogą pomyślnie konwertować ciągi, które zawierają cyfry dziesiętne tylko do wartości całkowitych.By default, the Parse and TryParse methods can successfully convert strings that contain integral decimal digits only to integer values. Mogą pomyślnie konwertować ciągi, które zawierają cyfry całkowite i ułamkowe dziesiętne, separatory grup i separator dziesiętny do wartości zmiennoprzecinkowych.They can successfully convert strings that contain integral and fractional decimal digits, group separators, and a decimal separator to floating-point values. ParseMetoda zgłasza wyjątek, jeśli operacja nie powiedzie się, a TryParse Metoda zwraca false .The Parse method throws an exception if the operation fails, whereas the TryParse method returns false.

Analiza składniowa i format dostawcówParsing and Format Providers

Zazwyczaj reprezentacje ciągów wartości liczbowych różnią się w zależności od kultury.Typically, the string representations of numeric values differ by culture. Elementy ciągów liczbowych, takich jak symbole walut, separatory grup (lub tysięcy) i Separatory dziesiętne różnią się w zależności od kultury.Elements of numeric strings such as currency symbols, group (or thousands) separators, and decimal separators all vary by culture. Metody analizy niejawnie lub jawnie używają dostawcy formatu, który rozpoznaje te Wariacje specyficzne dla kultury.Parsing methods either implicitly or explicitly use a format provider that recognizes these culture-specific variations. Jeśli w wywołaniu metody lub nie określono dostawcy formatu Parse TryParse , jest używany dostawca formatu skojarzony z bieżącą kulturą wątku ( NumberFormatInfo obiekt zwracany przez NumberFormatInfo.CurrentInfo Właściwość).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.

Dostawca formatu jest reprezentowany przez IFormatProvider implementację.A format provider is represented by an IFormatProvider implementation. Ten interfejs ma jeden element członkowski, GetFormat Metoda, której pojedynczy parametr jest Type obiektem, który reprezentuje typ do sformatowania.This interface has a single member, the GetFormat method, whose single parameter is a Type object that represents the type to be formatted. Ta metoda zwraca obiekt, który dostarcza informacje o formatowaniu.This method returns the object that provides formatting information. Platforma .NET obsługuje następujące dwie IFormatProvider implementacje analizy ciągów liczbowych:.NET supports the following two IFormatProvider implementations for parsing numeric strings:

Poniższy przykład próbuje skonwertować każdy ciąg w tablicy do Double wartości.The following example tries to convert each string in an array to a Double value. Najpierw próbuje przeanalizować ciąg przy użyciu dostawcy formatu, który odzwierciedla konwencje angielskiej (Stany Zjednoczone) kultury.It first tries to parse the string by using a format provider that reflects the conventions of the English (United States) culture. Jeśli ta operacja zgłasza FormatException , próbuje przeanalizować ciąg przy użyciu dostawcy formatu, który odzwierciedla konwencje kultury francuskiej (Francja).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'.

Analiza składniowa i wartości NumberStylesParsing and NumberStyles Values

Elementy stylu (takie jak odstępy, separatory grup i separator dziesiętny), które może obsłużyć operacja analizy, są definiowane przez NumberStyles wartość wyliczenia.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. Domyślnie ciągi reprezentujące wartości całkowite są analizowane przy użyciu NumberStyles.Integer wartości, która zezwala na tylko cyfry liczbowe, wiodące i końcowe białe znaki oraz znak wiodący.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. Ciągi reprezentujące wartości zmiennoprzecinkowe są analizowane przy użyciu kombinacji NumberStyles.Float i NumberStyles.AllowThousands wartości; ten styl złożony dopuszcza cyfry dziesiętne oraz wiodące i końcowe białe znaki, znak wiodący, separator dziesiętny, separator grupy i wykładnik.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. Wywołując Przeciążenie Parse TryParse metody lub, która zawiera parametr typu NumberStyles i ustawiając jedną lub więcej NumberStyles flag, można kontrolować elementy stylu, które mogą być obecne w ciągu, aby operacja analizy powiodła się.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.

Na przykład ciąg zawierający separator grupy nie może zostać skonwertowany na Int32 wartość za pomocą Int32.Parse(String) metody.For example, a string that contains a group separator cannot be converted to an Int32 value by using the Int32.Parse(String) method. Jednak konwersja powiedzie się, jeśli używasz NumberStyles.AllowThousands flagi, jak pokazano w poniższym przykładzie.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

Ostrzeżenie

Operacja analizy zawsze używa Konwencji formatowania określonej kultury.The parse operation always uses the formatting conventions of a particular culture. Jeśli nie określisz kultury przez przekazanie CultureInfo NumberFormatInfo obiektu, używana jest kultura skojarzona z bieżącym wątkiem.If you do not specify a culture by passing a CultureInfo or NumberFormatInfo object, the culture associated with the current thread is used.

W poniższej tabeli wymieniono elementy członkowskie NumberStyles wyliczenia i opisano wpływ ich działania na operację analizowania.The following table lists the members of the NumberStyles enumeration and describes the effect that they have on the parsing operation.

Wartość wyliczenia NumberStylesNumberStyles value Wpływ na ciąg, który ma zostać przeanalizowanyEffect on the string to be parsed
NumberStyles.None Dozwolone są tylko cyfry numeryczne.Only numeric digits are permitted.
NumberStyles.AllowDecimalPoint Dozwolone są Separatory dziesiętne i cyfry ułamkowe.The decimal separator and fractional digits are permitted. W przypadku wartości całkowitych jako cyfry ułamkowej dozwolony jest tylko zero.For integer values, only zero is permitted as a fractional digit. Prawidłowe Separatory dziesiętne są określane przez NumberFormatInfo.NumberDecimalSeparator NumberFormatInfo.CurrencyDecimalSeparator Właściwość or.Valid decimal separators are determined by the NumberFormatInfo.NumberDecimalSeparator or NumberFormatInfo.CurrencyDecimalSeparator property.
NumberStyles.AllowExponent Znak "e" lub "E" może służyć do wskazania notacji wykładniczej.The "e" or "E" character can be used to indicate exponential notation. NumberStylesAby uzyskać dodatkowe informacje, zobacz.See NumberStyles for additional information.
NumberStyles.AllowLeadingWhite Jest dozwolony wiodący biały znak.Leading white space is permitted.
NumberStyles.AllowTrailingWhite Białe znaki końcowe są dozwolone.Trailing white space is permitted.
NumberStyles.AllowLeadingSign Znak dodatni lub ujemny może poprzedzać cyfry cyfr.A positive or negative sign can precede numeric digits.
NumberStyles.AllowTrailingSign Znak dodatni lub ujemny może następować po cyfrach numerycznych.A positive or negative sign can follow numeric digits.
NumberStyles.AllowParentheses Nawiasy mogą służyć do wskazania wartości ujemnych.Parentheses can be used to indicate negative values.
NumberStyles.AllowThousands Separator grupy jest dozwolony.The group separator is permitted. Znak separatora grupy jest określany przez NumberFormatInfo.NumberGroupSeparator NumberFormatInfo.CurrencyGroupSeparator Właściwość or.The group separator character is determined by the NumberFormatInfo.NumberGroupSeparator or NumberFormatInfo.CurrencyGroupSeparator property.
NumberStyles.AllowCurrencySymbol Symbol waluty jest dozwolony.The currency symbol is permitted. Symbol waluty jest definiowany przez NumberFormatInfo.CurrencySymbol Właściwość.The currency symbol is defined by the NumberFormatInfo.CurrencySymbol property.
NumberStyles.AllowHexSpecifier Ciąg, który ma być analizowany, jest interpretowany jako liczba szesnastkowa.The string to be parsed is interpreted as a hexadecimal number. Może zawierać cyfry szesnastkowe 0-9, A-F i a-f.It can include the hexadecimal digits 0-9, A-F, and a-f. Ta flaga może być używana tylko do analizowania wartości całkowitych.This flag can be used only to parse integer values.

Ponadto NumberStyles Wyliczenie zawiera następujące style złożone, które obejmują wiele NumberStyles flag.In addition, the NumberStyles enumeration provides the following composite styles, which include multiple NumberStyles flags.

Złożona wartość wyliczenia NumberStylesComposite NumberStyles value Obejmuje członkówIncludes members
NumberStyles.Integer Zawiera NumberStyles.AllowLeadingWhite Style, NumberStyles.AllowTrailingWhite i NumberStyles.AllowLeadingSign .Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, and NumberStyles.AllowLeadingSign styles. Jest to domyślny styl używany do analizowania wartości całkowitych.This is the default style used to parse integer values.
NumberStyles.Number Zawiera NumberStyles.AllowLeadingWhite Style, NumberStyles.AllowTrailingWhite ,,, NumberStyles.AllowLeadingSign NumberStyles.AllowTrailingSign NumberStyles.AllowDecimalPoint i NumberStyles.AllowThousands .Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowTrailingSign, NumberStyles.AllowDecimalPoint, and NumberStyles.AllowThousands styles.
NumberStyles.Float Zawiera NumberStyles.AllowLeadingWhite Style, NumberStyles.AllowTrailingWhite , NumberStyles.AllowLeadingSign , NumberStyles.AllowDecimalPoint i NumberStyles.AllowExponent .Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowDecimalPoint, and NumberStyles.AllowExponent styles.
NumberStyles.Currency Zawiera wszystkie style z wyjątkiem NumberStyles.AllowExponent i NumberStyles.AllowHexSpecifier .Includes all styles except NumberStyles.AllowExponent and NumberStyles.AllowHexSpecifier.
NumberStyles.Any Zawiera wszystkie style z wyjątkiem NumberStyles.AllowHexSpecifier .Includes all styles except NumberStyles.AllowHexSpecifier.
NumberStyles.HexNumber Zawiera NumberStyles.AllowLeadingWhite Style, NumberStyles.AllowTrailingWhite i NumberStyles.AllowHexSpecifier .Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, and NumberStyles.AllowHexSpecifier styles.

Analiza składniowa i cyfry UnicodeParsing and Unicode Digits

Standard Unicode definiuje punkty kodów dla cyfr w różnych systemach pisania.The Unicode standard defines code points for digits in various writing systems. Na przykład punkty kodów z U + 0030 do U + 0039 reprezentują podstawowe cyfry łacińskie od 0 do 9, punkty kodów z U + 09E6 do U + 09EF reprezentują cyfry bengalskie od 0 do 9, a punkty kodu z U + FF10 do U + FF19 reprezentują cyfry pełnej od 0 do 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. Jednak jedynymi cyframi, które są rozpoznawane przez metody analizy, są podstawowe cyfry łacińskie 0-9 z punktami kodu od U + 0030 do U + 0039.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. Jeśli metoda analizy liczbowej została przeniesiona jako ciąg, który zawiera inne cyfry, metoda zgłasza FormatException .If a numeric parsing method is passed a string that contains any other digits, the method throws a FormatException.

Poniższy przykład używa Int32.Parse metody do analizowania ciągów, które składają się z cyfr w różnych systemach pisania.The following example uses the Int32.Parse method to parse strings that consist of digits in different writing systems. Jak wynika z przykładu, próba przeanalizowania podstawowych cyfr szesnastkowych powiedzie się, ale próba przeanalizowania cyfr pełnej, arabskiej-indyjskich i bengalskich kończy się niepowodzeniem.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 '১২৩৪৫'.

Zobacz teżSee also