Freigeben über


Verarbeiten numerischer Zeichenfolgen

Aktualisiert: August 2010

Alle numerischen Typen weisen zwei statische Analysemethoden auf: Parse und TryParse. Diese können Sie verwenden, um die Zeichenfolgendarstellung einer Zahl in einen numerischen Typ zu konvertieren. Diese Methoden ermöglichen es Ihnen, Zeichenfolgen zu analysieren, die mithilfe der in Standardmäßige Zahlenformatzeichenfolgen und Benutzerdefinierte Zahlenformatzeichenfolgen dokumentierten Formatzeichenfolgen erstellt wurden. Standardmäßig können die TryParse-Methode und die Parse-Methode nur Zeichenfolgen, die ganzzahlige Dezimalziffern enthalten, erfolgreich in ganzzahlige Werte konvertieren. Die Methoden können erfolgreich Zeichenfolgen in Gleitkommawerte konvertieren, die ganzzahlige und Bruchdezimalziffern, Gruppentrennzeichen und ein Dezimaltrennzeichen enthalten. Die Parse-Methode löst eine Ausnahme aus, wenn der Vorgang fehlschlägt, während die TryParse-Methode false zurückgibt.

Analysieren und Formatanbieter

Normalerweise unterscheiden sich die Zeichenfolgendarstellungen numerischer Werte nach Kultur. Elemente numerischer Zeichenfolgen wie Währungssymbole, Gruppentrennzeichen (oder Tausendertrennzeichen) und Dezimaltrennzeichen variieren je nach Kultur. Analysemethoden verwenden entweder implizit oder explizit einen Formatanbieter, der diese kulturspezifische Variationen erkennt. Wenn in einem Aufruf der TryParse-Methode oder der Parse-Methode kein Formatanbieter angegeben ist, wird der Formatanbieter verwendet, der der aktuellen Threadkultur zugeordnet ist (das NumberFormatInfo-Objekt, das von der NumberFormatInfo.CurrentInfo-Eigenschaft zurückgegeben wird).

Ein Formatanbieter wird durch eine IFormatProvider-Implementierung dargestellt. Diese Schnittstelle verfügt über einen einzelnen Member – die GetFormat-Methode, deren einziger Parameter ein Type-Objekt ist, das den zu formatierenden Typ darstellt. Diese Methode gibt das Objekt zurück, das Formatierungsinformationen bereitstellt. .NET Framework unterstützt die folgenden zwei IFormatProvider-Implementierungen für das Analysieren von numerischen Zeichenfolgen:

Im folgenden Beispiel wird versucht, jede Zeichenfolge in einem Array in einen Double-Wert zu konvertieren. Zunächst wird versucht, die Zeichenfolge mithilfe eines Formatanbieters zu analysieren, der die Konventionen der Kultur Englisch (USA) darstellt. Wenn dieser Vorgang eine FormatException auslöst, wird versucht, die Zeichenfolge mithilfe eines Formatanbieters zu analysieren, der die Konventionen der Kultur Französisch (Frankreich) darstellt.

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

Analysieren und NumberStyles-Werte

Welche Formatelemente (z. B. Leerräume, Gruppentrennzeichen und Dezimaltrennzeichen) vom Analysevorgang behandelt werden können, wird durch einen NumberStyles-Enumerationswert definiert. Standardmäßig werden Zeichenfolgen, die ganzzahlige Werte darstellen, mithilfe des NumberStyles.Integer-Werts analysiert, der nur numerische Ziffern, vorangestellte und nachfolgende Leerraumzeichen und ein führendes Zeichen zulässt. Zeichenfolgen, die Gleitkommawerte darstellen, werden mithilfe einer Kombination des NumberStyles.Float-Werts und des NumberStyles.AllowThousands-Werts analysiert. Dieses kombinierte Format lässt Dezimalziffern zusammen mit führenden und nachgestellten Leerraumzeichen, einem führenden Zeichen, einem Dezimaltrennzeichen, einem Gruppentrennzeichen und einem Exponenten zu. Wenn Sie eine Überladung der Parse-Methode bzw. der TryParse-Methode aufrufen, die einen Parameter vom Typ NumberStyles enthält, und mindestens ein NumberStyles-Flag festlegen, können Sie steuern, welche Formatelemente in der Zeichenfolge vorhanden sein dürfen, damit der Analysevorgang erfolgreich ausgeführt werden kann.

Beispielsweise kann eine Zeichenfolge, die ein Gruppentrennzeichen enthält, mit der Int32.Parse(String)-Methode nicht in einen Int32 Wert konvertiert werden. Die Konvertierung wird jedoch erfolgreich durchgeführt, wenn Sie das NumberStyles.AllowThousands-Flag verwenden, wie im folgenden Beispiel veranschaulicht.

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
WarnhinweisVorsicht

Im Analysevorgang werden immer die Formatierungskonventionen einer bestimmten Kultur verwendet.Wenn Sie kein CultureInfo-Objekt bzw. NumberFormatInfo-Objekt übergeben, um eine Kultur anzugeben, wird die dem aktuellen Thread zugeordnete Kultur verwendet.

In der folgenden Tabelle werden die Member der NumberStyles-Enumeration aufgeführt und ihre Auswirkungen auf den Analysevorgang beschrieben.

NumberStyles-Wert

Auswirkung auf die zu analysierende Zeichenfolge

NumberStyles.None

Nur numerische Ziffern sind zulässig.

NumberStyles.AllowDecimalPoint

Das Dezimaltrennzeichen und Bruchziffern sind zulässig. Für ganzzahlige Werte ist nur 0 (null) als Dezimalstelle zulässig. Die gültigen Dezimaltrennzeichen werden von der NumberFormatInfo.NumberDecimalSeparator-Eigenschaft oder der NumberFormatInfo.CurrencyDecimalSeparator-Eigenschaft bestimmt.

NumberStyles.AllowExponent

Das Zeichen "e" oder "E" kann verwendet werden, um die Exponentialschreibweise anzugeben. Weitere Informationen finden Sie unter NumberStyles.

NumberStyles.AllowLeadingWhite

Führender Leerraum ist zulässig.

NumberStyles.AllowTrailingWhite

Nachgestellter Leerraum ist zulässig.

NumberStyles.AllowLeadingSign

Numerischen Ziffern kann ein Plus- oder Minuszeichen vorangestellt sein.

NumberStyles.AllowTrailingSign

Numerischen Ziffern kann ein Plus- oder Minuszeichen nachgestellt sein.

NumberStyles.AllowParentheses

Zur Angabe von negativen Werten können Klammern verwendet werden.

NumberStyles.AllowThousands

Das Gruppentrennzeichen ist zulässig. Das Gruppentrennzeichen wird von der NumberFormatInfo.NumberGroupSeparator-Eigenschaft oder der NumberFormatInfo.CurrencyGroupSeparator-Eigenschaft bestimmt.

NumberStyles.AllowCurrencySymbol

Das Währungssymbol ist zulässig. Das Währungssymbol wird von der NumberFormatInfo.CurrencySymbol-Eigenschaft definiert.

NumberStyles.AllowHexSpecifier

Die zu analysierende Zeichenfolge wird als Hexadezimalzahl interpretiert. Enthalten sein können die Hexadezimalziffern 0-9, A-F und a-f. Dieses Flag kann nur zur Analyse ganzzahliger Werte verwendet werden.

Außerdem stellt die NumberStyles-Enumeration die folgenden zusammengesetzten Formate bereit, die mehrere NumberStyles-Flags umfassen.

Zusammengesetzter NumberStyles-Wert

Enthaltene Member

NumberStyles.Integer

Enthält die Formate NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite und NumberStyles.AllowLeadingSign. Dies ist das Standardformat für die Analyse von ganzzahligen Werten.

NumberStyles.Number

Enthält die Formate NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowTrailingSign, NumberStyles.AllowDecimalPoint und NumberStyles.AllowThousands.

NumberStyles.Float

Enthält die Formate NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowDecimalPoint und NumberStyles.AllowExponent.

NumberStyles.Currency

Enthält alle Formate mit Ausnahme von NumberStyles.AllowExponent und NumberStyles.AllowHexSpecifier.

NumberStyles.Any

Enthält alle Formate mit Ausnahme von NumberStyles.AllowHexSpecifier.

NumberStyles.HexNumber

Enthält die Formate NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite und NumberStyles.AllowHexSpecifier.

Analysieren und Unicode-Ziffern

Der Unicode-Standard definiert Codepunkte für Ziffern in verschiedenen Schreibsystemen. Codepunkte von U+0030 bis U+0039 stellen zum Beispiel die grundlegenden lateinischen Ziffern 0 bis 9 dar, Codepunkte von U+09E6 bis U+09EF stellen die Bangla-Ziffern 0 bis 9 dar, und Codepunkte von U+FF10 bis U+FF19 stellen die vollbreiten Ziffern 0 bis 9 dar. Allerdings sind die einzigen numerischen Ziffern, die von Analysemethoden erkannt werden, die grundlegenden lateinischen Ziffern 0-9 mit Codepunkten von U+0030 bis U+0039. Wenn einer numerischen Analysemethode eine Zeichenfolge übergeben wird, die andere Ziffern enthält, löst die Methode eine FormatException aus.

Im folgenden Beispiel wird die Int32.Parse-Methode zum Analysieren von Zeichenfolgen verwendet, die aus Ziffern verschiedener Schreibsysteme bestehen. Wie die Ausgabe im Beispiel zeigt, ist der Versuch, die grundlegenden lateinischen Ziffern zu analysieren, erfolgreich. Der Versuch, die vollbreiten Ziffern, die arabisch-indischen Ziffern und die Bangla-Ziffern zu analysieren, schlägt allerdings fehl.

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

Siehe auch

Referenz

NumberStyles

Konzepte

Formatierung von Typen

Weitere Ressourcen

Verarbeiten von Zeichenfolgen

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

August 2010

Gründlich überarbeitet.

Informationsergänzung.