Sdílet prostřednictvím


Analýza číselných řetězců

Všechny číselné typy mají dvě statické metody analýzy Parse a TryParse, můžete převést řetězcové vyjádření čísla do číselného typu. Tyto metody umožňují analyzovat řetězce, které byly vyrobeny pomocí řetězce formátu v Standardní číselné formátovací řetězce a Vlastní číselné formátovací řetězce. Standardně Parse a TryParse metody úspěšně převést řetězce obsahující desetinná místa nedílnou pouze pro celočíselné hodnoty. Mohou úspěšně převést řetězce, které obsahují nedílnou a získáme desetinných míst, oddělovače skupin a desetinný oddělovač hodnot s plovoucí desetinnou čárkou. Parse Metoda výjimku Pokud se operace nezdaří, že TryParse Metoda vrátí false.

Formát zprostředkovatelů a parsing

Vyjádření řetězce číselné hodnoty obvykle liší kultury. Prvky číselného řetězce, například symboly měny (skupiny nebo tisíců) oddělovače, oddělovače desetinných míst a symboly měn se liší podle kultury. Při analýze metody buď implicitně nebo explicitně pomocí zprostředkovatele formát, který rozpoznává tyto specifické odchylky. Žádný zprostředkovatel formátu, pokud je určena ve volání Parse nebo TryParse Metoda, formát poskytovatele spojené s aktuální podproces kultury ( NumberFormatInfo objekt vrácený NumberFormatInfo.CurrentInfo vlastnost) používá.

Formát zprostředkovatele je reprezentován IFormatProvider provedení. Toto rozhraní má jediný člen, GetFormat metodou, jejíž jeden parametr je Type objekt představující typ formátování. Tato metoda vrátí objekt, který poskytuje informace o formátování. Na.NET Framework podporuje následující dva IFormatProvider implementace pro analýzu číselných řetězců:

V následujícím příkladu se pokusí převést každý řetězec v poli Double hodnotu. Nejprve se pokusí analyzovat řetězec pomocí zprostředkovatele formát, který odráží úmluv kultury Angličtina (Spojené státy). Pokud tato operace způsobí FormatException, pokusí analyzovat řetězec pomocí formátu zprostředkovatele, který odráží úmluvy z kultura francouzština (Francie).

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'.
'    ' 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'.
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'.

Hodnoty NumberStyles a parsing

Styl prvky (například prázdné znaky oddělovače skupin a oddělovač desetinných míst), které může operace analýzy jsou definovány NumberStyles hodnotu výčtu. Standardně jsou řetězce, které představují celočíselných hodnot analyzován pomocí NumberStyles.Integer hodnotu, která umožňuje pouze číslic, úvodní a koncové prázdné místo a úvodní znak. Řetězce, které představují hodnoty s plovoucí desetinnou čárkou jsou analyzovány pomocí kombinace NumberStyles.Float a NumberStyles.AllowThousands hodnoty; Tento styl složený umožňuje spolu s úvodní a koncové bílých, úvodní znak, desetinný oddělovač, oddělovač skupin a exponentu desetinných míst. Voláním nadměrného počtu Parse nebo TryParse Metoda, která zahrnuje parametr typu NumberStyles a nastavení jedné nebo více NumberStyles příznaky, můžete řídit elementy stylu, které mohou být přítomny v řetězci analýzy operace úspěšná.

Například řetězec, který obsahuje oddělovač skupin nelze převést na Int32 hodnotu pomocí Int32.Parse(String) Metoda však převod úspěšný při použití NumberStyles.AllowThousands příznak, jak ukazuje následující příklad.

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
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
Poznámka k upozorněníUpozornění

Operace analýzy vždy používá formátování konvence konkrétní kultury.Pokud nezadáte kultury předáním CultureInfo nebo NumberFormatInfo objekt používá kultury přidružený k aktuálnímu podprocesu.

Následující tabulka uvádí členy NumberStyles výčet a popisuje vliv na analýzu operace.

Hodnota NumberStyles

Vliv na řetězec, který má být analyzován

NumberStyles.None

Jsou povoleny pouze číslicemi.

NumberStyles.AllowDecimalPoint

Oddělovač desetinných míst a desetinnou jsou povoleny. Pro celočíselné hodnoty je povoleno pouze nulovou jako zlomek číslice. Platné oddělovače desetinných míst závisí NumberFormatInfo.NumberDecimalSeparator nebo NumberFormatInfo.CurrencyDecimalSeparator vlastnost.

NumberStyles.AllowExponent

"e" nebo "E" znak lze označit exponenciálním zápisu. Viz NumberStyles pro další informace.

NumberStyles.AllowLeadingWhite

Úvodní mezery je povoleno.

NumberStyles.AllowTrailingWhite

Je dovoleno koncové mezery.

NumberStyles.AllowLeadingSign

Kladné nebo záporné znaménko lze předcházet číslicemi.

NumberStyles.AllowTrailingSign

Kladné nebo záporné znaménko podle číslic.

NumberStyles.AllowParentheses

Závorky slouží k označení záporné hodnoty.

NumberStyles.AllowThousands

Oddělovač skupin je povoleno. Znak oddělovače skupin závisí NumberFormatInfo.NumberGroupSeparator nebo NumberFormatInfo.CurrencyGroupSeparator vlastnost.

NumberStyles.AllowCurrencySymbol

Symbol měny je povolen. Symbol měny definované NumberFormatInfo.CurrencySymbol vlastnost.

NumberStyles.AllowHexSpecifier

Řetězec, který má být analyzován interpretována jako hexadecimální číslo. Může obsahovat šestnáctková číslice 0-9, A-F a -f. Tento příznak slouží pouze k analýze celočíselné hodnoty.

Kromě toho NumberStyles Výčet obsahuje následující složené styly, které obsahují více NumberStyles příznaky.

Složené hodnotu NumberStyles

Zahrnuje členy

NumberStyles.Integer

Zahrnuje NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, a NumberStyles.AllowLeadingSign styly. Toto je výchozí styl použit k analýze celočíselné hodnoty.

NumberStyles.Number

Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowTrailingSign, NumberStyles.AllowDecimalPoint, and NumberStyles.AllowThousands styles.

NumberStyles.Float

Includes the NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowDecimalPoint, and NumberStyles.AllowExponent styles.

NumberStyles.Currency

Zahrnuje všechny styly, s výjimkou NumberStyles.AllowExponent a NumberStyles.AllowHexSpecifier.

NumberStyles.Any

Zahrnuje všechny styly, s výjimkou NumberStyles.AllowHexSpecifier.

NumberStyles.HexNumber

Zahrnuje NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, a NumberStyles.AllowHexSpecifier styly.

Parsing a číslice Unicode

Unicode standard definuje body kódu pro číslice v různých systémů zápisu. Například kód body od U + 0030 U + 0039 představují základní latinky číslic 0 až 9, body kódu z 09E6 U + U + 09EF představují Bengálská číslice 0 až 9 a bodů kódu od U + FF10 U + FF19 představují Tučná číslice 0 až 9. Základní latinky číslice 0-9 s body kódu od U + 0030 U + 0039 jsou však pouze číslicemi uznané metody analýzy. Pokud číselné analýze metody je předán řetězec, který obsahuje další číslice, vyvolá metoda FormatException.

V následujícím příkladu Int32.Parse psaní metody pro analýzu řetězce, které se skládají z číslic v různých systémech. Výstup z příkladu ukazuje pokus úspěšný číslic základní latinky analýzy, ale pokus analyzovat tučné, Arabská a Bengálská číslice se nezdaří.

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 Bengali 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 '১২৩৪৫'.
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 Bengali 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 '১২৩৪৫'.

Viz také

Odkaz

NumberStyles

Koncepty

Typy formátování

Další zdroje

Analýza řetězců

Historie změn

Datum

Poslední dokumenty

Důvod

Srpen 2010

Rozsáhlé revidován.

Rozšíření informace