Analýza číselných řetězců v síti NETParsing Numeric Strings in NET

Všechny číselné typy mají dvě statické metody Parse analýzy a TryParse, které lze použít k převedení řetězcové reprezentace čísla na číselný typ.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. Tyto metody umožňují analyzovat řetězce, které byly vytvořeny pomocí řetězců formátu v hodnotách standardního číselného formátu a řetězců vlastního číselného formátu.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. Ve výchozím nastavení Parse metody a TryParse mohou úspěšně převést řetězce, které obsahují celočíselné desítkové číslice pouze na celočíselné hodnoty.By default, the Parse and TryParse methods can successfully convert strings that contain integral decimal digits only to integer values. Můžou úspěšně převést řetězce, které obsahují celočíselné a zlomkové číslice, oddělovače skupin a oddělovač desetinných míst na hodnoty s plovoucí desetinnou čárkou.They can successfully convert strings that contain integral and fractional decimal digits, group separators, and a decimal separator to floating-point values. Metoda vyvolá výjimku, pokud se operace nezdařila, TryParse zatímco metoda vrátí false. ParseThe Parse method throws an exception if the operation fails, whereas the TryParse method returns false.

Poskytovatelé analýzy a formátuParsing and Format Providers

Obvykle se řetězcové reprezentace číselných hodnot liší podle jazykové verze.Typically, the string representations of numeric values differ by culture. Prvky číselných řetězců, jako jsou symboly měn, oddělovače skupin (nebo tisíců) a oddělovač desetinných míst, se liší podle jazykové verze.Elements of numeric strings such as currency symbols, group (or thousands) separators, and decimal separators all vary by culture. Metody analýzy implicitně nebo explicitně používají poskytovatele formátu, který tyto variace specifické pro jazykovou verzi rozpoznává.Parsing methods either implicitly or explicitly use a format provider that recognizes these culture-specific variations. Pokud není zadán žádný poskytovatel Parse formátu ve volání metody nebo TryParse , je použit poskytovatel formátu přidružený k NumberFormatInfo aktuální jazykové verzi vlákna (objekt vrácený NumberFormatInfo.CurrentInfo vlastností).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.

Zprostředkovatel formátu je reprezentován IFormatProvider implementací.A format provider is represented by an IFormatProvider implementation. Toto rozhraní má jednoho člena, GetFormat metodu, jejíž jeden parametr Type je objekt, který představuje typ, který má být formátován.This interface has a single member, the GetFormat method, whose single parameter is a Type object that represents the type to be formatted. Tato metoda vrátí objekt, který poskytuje informace o formátování.This method returns the object that provides formatting information. Rozhraní .NET podporuje následující dvě IFormatProvider implementace pro analýzu číselných řetězců:.NET supports the following two IFormatProvider implementations for parsing numeric strings:

Následující příklad se pokusí převést každý řetězec v poli na Double hodnotu.The following example tries to convert each string in an array to a Double value. Nejprve se pokusí analyzovat řetězec pomocí poskytovatele formátu, který odráží konvenci jazykové verze English (USA).It first tries to parse the string by using a format provider that reflects the conventions of the English (United States) culture. Pokud tato operace vyvolá výjimku FormatException, pokusí se analyzovat řetězec pomocí poskytovatele formátu, který odráží konvence francouzské jazykové verze (Francie).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'.

Analýza a hodnoty NumberStylesParsing and NumberStyles Values

Prvky stylu (například prázdné znaky, oddělovače skupin a oddělovač desetinných míst), které může operace analýzy zpracovat, jsou definovány NumberStyles hodnotou výčtu.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. Ve výchozím nastavení jsou řetězce, které představují celočíselné hodnoty, analyzovány NumberStyles.Integer pomocí hodnoty, která povoluje pouze číselné číslice, úvodní a koncové prázdné znaky a úvodní znaménko.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. Řetězce, které představují hodnoty s plovoucí desetinnou čárkou, jsou analyzovány NumberStyles.Float pomocí NumberStyles.AllowThousands kombinace hodnot a. Tento složený styl povoluje desítkové číslice spolu s úvodním a koncovým prázdným znakem, úvodní znaménko, oddělovač desetinných míst, skupina oddělovač a exponent.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. Voláním přetížení Parse metody nebo TryParse , která obsahuje parametr typu NumberStyles a nastavením jednoho nebo více NumberStyles příznaků, lze řídit prvky stylu, které mohou být přítomny v řetězci pro operaci analýzy na provedena.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.

Například řetězec, který obsahuje oddělovač skupiny, nelze převést na Int32 hodnotu Int32.Parse(String) pomocí metody.For example, a string that contains a group separator cannot be converted to an Int32 value by using the Int32.Parse(String) method. Převod je však úspěšný při použití NumberStyles.AllowThousands příznaku, jak ukazuje následující příklad.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

Varování

Operace analýzy vždy používá konvence formátování konkrétní jazykové verze.The parse operation always uses the formatting conventions of a particular culture. Pokud nezadáte jazykovou verzi předáním CultureInfo objektu nebo NumberFormatInfo , je použita jazyková verze přidružená k aktuálnímu vláknu.If you do not specify a culture by passing a CultureInfo or NumberFormatInfo object, the culture associated with the current thread is used.

Následující tabulka uvádí členy NumberStyles výčtu a popisuje účinek, který mají na operaci analýzy.The following table lists the members of the NumberStyles enumeration and describes the effect that they have on the parsing operation.

Hodnota NumberStylesNumberStyles value Vliv na řetězec, který se má analyzovatEffect on the string to be parsed
NumberStyles.None Jsou povoleny pouze číslice.Only numeric digits are permitted.
NumberStyles.AllowDecimalPoint Oddělovač desetinných míst a číslice zlomků jsou povoleny.The decimal separator and fractional digits are permitted. U celočíselných hodnot je jako zlomková číslice povolena pouze nula.For integer values, only zero is permitted as a fractional digit. Platné oddělovače desetinných míst jsou určeny NumberFormatInfo.NumberDecimalSeparator vlastností NumberFormatInfo.CurrencyDecimalSeparator or.Valid decimal separators are determined by the NumberFormatInfo.NumberDecimalSeparator or NumberFormatInfo.CurrencyDecimalSeparator property.
NumberStyles.AllowExponent Znak "e" nebo "E" lze použít k označení exponenciálního zápisu.The "e" or "E" character can be used to indicate exponential notation. Další NumberStyles informace najdete v tématu.See NumberStyles for additional information.
NumberStyles.AllowLeadingWhite Je povoleno počáteční prázdné místo.Leading white space is permitted.
NumberStyles.AllowTrailingWhite Koncová mezera je povolena.Trailing white space is permitted.
NumberStyles.AllowLeadingSign Kladné nebo záporné znaménko může předcházet číslicemi.A positive or negative sign can precede numeric digits.
NumberStyles.AllowTrailingSign Kladné nebo záporné znaménko může následovat po číslicích.A positive or negative sign can follow numeric digits.
NumberStyles.AllowParentheses Závorky lze použít k označení záporných hodnot.Parentheses can be used to indicate negative values.
NumberStyles.AllowThousands Oddělovač skupin je povolený.The group separator is permitted. Znak oddělovače skupiny je určen NumberFormatInfo.NumberGroupSeparator vlastností or. NumberFormatInfo.CurrencyGroupSeparatorThe group separator character is determined by the NumberFormatInfo.NumberGroupSeparator or NumberFormatInfo.CurrencyGroupSeparator property.
NumberStyles.AllowCurrencySymbol Symbol měny je povolený.The currency symbol is permitted. Symbol měny je definován NumberFormatInfo.CurrencySymbol vlastností.The currency symbol is defined by the NumberFormatInfo.CurrencySymbol property.
NumberStyles.AllowHexSpecifier Řetězec, který má být analyzován, je interpretován jako šestnáctkové číslo.The string to be parsed is interpreted as a hexadecimal number. Může zahrnovat hexadecimální číslice 0-9, A-F a a-F.It can include the hexadecimal digits 0-9, A-F, and a-f. Tento příznak lze použít pouze k analýze celočíselných hodnot.This flag can be used only to parse integer values.

Kromě toho NumberStyles výčet poskytuje následující složené styly, které obsahují více NumberStyles příznaků.In addition, the NumberStyles enumeration provides the following composite styles, which include multiple NumberStyles flags.

Složená hodnota NumberStylesComposite NumberStyles value Obsahuje členyIncludes members
NumberStyles.Integer Obsahuje styly NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhitea NumberStyles.AllowLeadingSign .Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, and NumberStyles.AllowLeadingSign styles. Toto je výchozí styl použitý k analýze celočíselných hodnot.This is the default style used to parse integer values.
NumberStyles.Number NumberStyles.AllowTrailingWhite ObsahujestylyNumberStyles.AllowLeadingSign, ,,NumberStyles.AllowThousands , a. NumberStyles.AllowTrailingSign NumberStyles.AllowLeadingWhite NumberStyles.AllowDecimalPointIncludes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowTrailingSign, NumberStyles.AllowDecimalPoint, and NumberStyles.AllowThousands styles.
NumberStyles.Float NumberStyles.AllowTrailingWhite ObsahujestylyNumberStyles.AllowLeadingSign, ,,NumberStyles.AllowExponent a. NumberStyles.AllowLeadingWhite NumberStyles.AllowDecimalPointIncludes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowDecimalPoint, and NumberStyles.AllowExponent styles.
NumberStyles.Currency Zahrnuje všechny styly kromě NumberStyles.AllowExponent a NumberStyles.AllowHexSpecifier.Includes all styles except NumberStyles.AllowExponent and NumberStyles.AllowHexSpecifier.
NumberStyles.Any Zahrnuje všechny styly s NumberStyles.AllowHexSpecifiervýjimkou.Includes all styles except NumberStyles.AllowHexSpecifier.
NumberStyles.HexNumber Obsahuje styly NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhitea NumberStyles.AllowHexSpecifier .Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, and NumberStyles.AllowHexSpecifier styles.

Analýza a číslice v kódování UnicodeParsing and Unicode Digits

Standard Unicode definuje body kódu pro číslice v různých systémech pro psaní.The Unicode standard defines code points for digits in various writing systems. Například body kódu z U + 0030 na U + 0039 reprezentují základní číslice od 0 do 9, body kódu z + 09E6 do U + 09EF reprezentují hodnoty bengálština 0 až 9 a body kódu z U + FF10 do U + FF19 reprezentují tučná čísla 0 až 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. Jedinými číselnými číslicemi, které byly rozpoznány metodou analýzy, jsou však základní číslice latinky 0-9 a body kódu z U + 0030 až 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. Pokud je metoda číselné analýzy předána řetězcem, který obsahuje jakékoli jiné číslice, vyvolá FormatExceptionmetoda.If a numeric parsing method is passed a string that contains any other digits, the method throws a FormatException.

Následující příklad používá Int32.Parse metodu k analýze řetězců, které se skládají z číslic v různých systémech pro zápis.The following example uses the Int32.Parse method to parse strings that consist of digits in different writing systems. Jak ukazuje výstup z příkladu, pokus o analýzu základních číslic latinky je úspěšný, ale pokus o analýzu tučné, arabského a desítkové číslice selže.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 '১২৩৪৫'.

Viz také:See also