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:
Ein CultureInfo-Objekt, dessen CultureInfo.GetFormat-Methode ein NumberFormatInfo-Objekt zurückgibt, das kulturspezifische Formatierungsinformationen bereitstellt.
Ein NumberFormatInfo-Objekt, dessen NumberFormatInfo.GetFormat-Methode sich selbst zurückgibt.
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
![]() |
---|
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 |
---|---|
Nur numerische Ziffern sind zulässig. |
|
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. |
|
Das Zeichen "e" oder "E" kann verwendet werden, um die Exponentialschreibweise anzugeben. Weitere Informationen finden Sie unter NumberStyles. |
|
Führender Leerraum ist zulässig. |
|
Nachgestellter Leerraum ist zulässig. |
|
Numerischen Ziffern kann ein Plus- oder Minuszeichen vorangestellt sein. |
|
Numerischen Ziffern kann ein Plus- oder Minuszeichen nachgestellt sein. |
|
Zur Angabe von negativen Werten können Klammern verwendet werden. |
|
Das Gruppentrennzeichen ist zulässig. Das Gruppentrennzeichen wird von der NumberFormatInfo.NumberGroupSeparator-Eigenschaft oder der NumberFormatInfo.CurrencyGroupSeparator-Eigenschaft bestimmt. |
|
Das Währungssymbol ist zulässig. Das Währungssymbol wird von der NumberFormatInfo.CurrencySymbol-Eigenschaft definiert. |
|
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 |
---|---|
Enthält die Formate NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite und NumberStyles.AllowLeadingSign. Dies ist das Standardformat für die Analyse von ganzzahligen Werten. |
|
Enthält die Formate NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowTrailingSign, NumberStyles.AllowDecimalPoint und NumberStyles.AllowThousands. |
|
Enthält die Formate NumberStyles.AllowLeadingWhite, NumberStyles.AllowTrailingWhite, NumberStyles.AllowLeadingSign, NumberStyles.AllowDecimalPoint und NumberStyles.AllowExponent. |
|
Enthält alle Formate mit Ausnahme von NumberStyles.AllowExponent und NumberStyles.AllowHexSpecifier. |
|
Enthält alle Formate mit Ausnahme von NumberStyles.AllowHexSpecifier. |
|
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
Konzepte
Weitere Ressourcen
Änderungsprotokoll
Datum |
Versionsgeschichte |
Grund |
---|---|---|
August 2010 |
Gründlich überarbeitet. |
Informationsergänzung. |