Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
.NET unterstützt jetzt höhere Genauigkeitswerte, wenn Zahlen als Zeichenfolgen formatiert werden, mit ToString
und TryFormat
.
Hinweis
Die maximale Genauigkeit wurde in .NET 7 erneut geändert. Weitere Informationen finden Sie unter "Maximale Genauigkeit für numerische Formatzeichenfolgen".
Änderungsbeschreibung
Beim Formatieren von Zahlen als Zeichenfolgen stellt der Genauigkeitsbezeichner in der Formatzeichenfolge die Anzahl der Ziffern in der resultierenden Zeichenfolge dar. Je nach Formatbezeichner, bei dem es sich um das Zeichen am Anfang der Zeichenfolge handelt, kann die Genauigkeit die Gesamtanzahl der Ziffern, die Anzahl der signifikanten Ziffern oder die Anzahl der Dezimalziffern darstellen.
In früheren .NET-Versionen ist die Standardmäßige Numerische Formatanalyselogik auf eine Genauigkeit von 99 oder weniger beschränkt. Einige numerische Typen weisen eine größere Genauigkeit auf, jedoch zeigt ToString(string format)
sie nicht richtig an. Wenn Sie beispielsweise eine Genauigkeit angeben, die größer als 99 ist, 32.ToString("C100")
wird die Formatzeichenfolge als benutzerdefinierte numerische Formatzeichenfolge anstelle von "Währung mit Genauigkeit 100" interpretiert. In benutzerdefinierten zahlenformatischen Zeichenfolgen werden Zeichen als Zeichenliterale interpretiert. Darüber hinaus wird eine Formatzeichenfolge, die einen ungültigen Formatbezeichner enthält, je nach Genauigkeitswert unterschiedlich interpretiert.
H99
löst eine FormatException-Ausnahme für den ungültigen Formatspezifizierer aus, während H100
als benutzerdefinierte numerische Formatzeichenfolge interpretiert wird.
Ab .NET 6 unterstützt .NET die Genauigkeit bis zu Int32.MaxValue. Eine Formatzeichenfolge, die aus einem Formatbezeichner mit einer beliebigen Anzahl von Ziffern besteht, wird als standardmäßige numerische Formatzeichenfolge mit Genauigkeit interpretiert. Eine FormatException-Ausnahme wird für eine oder beide der folgenden Bedingungen ausgelöst:
- Das Formatbezeichnerzeichen ist kein Standardformatbezeichner.
- Die Genauigkeit ist größer als Int32.MaxValue.
Diese Änderung wurde in der Analyselogik implementiert, die sich auf alle numerischen Typen auswirkt.
Die folgende Tabelle zeigt die Verhaltensänderungen für verschiedene Formatzeichenfolgen.
Formatzeichenfolge | Vorheriges Verhalten | Verhalten ab .NET 6 |
---|---|---|
C2 |
Gibt die Währung mit zwei Dezimalziffern an. | Gibt die Währung mit zwei Dezimalziffern an (keine Änderung) |
C100 |
Bezeichnet eine benutzerdefinierte numerische Formatzeichenfolge, die "C100" ausgibt | Gibt die Währung mit 100 Dezimalziffern an. |
H99 |
Löst aufgrund eines ungültigen Standardformatspezifizierers "H" eine FormatException-Ausnahme aus | Löst aufgrund eines ungültigen Standardformatspezifizierers "H" eine FormatException-Ausnahme aus (keine Änderung) |
H100 |
Gibt eine benutzerdefinierte zahlenformatige Zeichenfolge an. | Löst aufgrund eines ungültigen Standardformatspezifizierers "H" eine FormatException-Ausnahme aus |
Eingeführte Version
.NET 6
Grund für Änderung
Diese Änderung korrigiert unerwartetes Verhalten bei verwendung höherer Genauigkeit für die Analyse numerischer Formate.
Empfohlene Aktion
In den meisten Fällen ist keine Aktion erforderlich, und die richtige Genauigkeit wird in den resultierenden Zeichenfolgen angezeigt.
Wenn Sie jedoch das vorherige Verhalten wiederherstellen möchten, bei dem der Formatspezifizierer als Literalzeichen interpretiert wird, wenn der Genauigkeitswert über 99 liegt, können Sie dieses Zeichen in einfachen Anführungszeichen umschließen oder mit einem umgekehrten Schrägstrich als Escapezeichen versehen. In früheren Versionen von .NET gibt 42.ToString("G999")
beispielsweise G999
zurück. Um dieses Verhalten beizubehalten, ändern Sie die Formatzeichenfolge in "'G'999"
oder "\\G999"
. Dies funktioniert unter .NET Framework, .NET Core und .NET 5+.
Die folgenden Formatzeichenfolgen werden weiterhin als benutzerdefinierte numerische Formatzeichenfolgen interpretiert:
- Beginnen Sie mit einem beliebigen Zeichen, das kein ASCII-alphabetisches Zeichen ist, wie zum Beispiel
$
oderè
. - Beginnen Sie mit einem ALPHABETISCHEN ASCII-Zeichen, auf das keine ASCII-Ziffer folgt,
A$
z. B. . . - Beginnen Sie mit einem ALPHABETISCHEN ASCII-Zeichen, gefolgt von einer ASCII-Ziffernfolge, und dann mit jedem Zeichen, das kein ASCII-Ziffernzeichen ist,
A12A
z. B. .
Betroffene APIs
Diese Änderung wurde in der Analyselogik implementiert, die sich auf alle numerischen Typen auswirkt.
- System.Numerics.BigInteger.ToString(String)
- System.Numerics.BigInteger.ToString(String, IFormatProvider)
- System.Numerics.BigInteger.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Int32.ToString(String)
- System.Int32.ToString(String, IFormatProvider)
- System.Int32.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt32.ToString(String)
- System.UInt32.ToString(String, IFormatProvider)
- System.UInt32.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Byte.ToString(String)
- System.Byte.ToString(String, IFormatProvider)
- System.Byte.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.SByte.ToString(String)
- System.SByte.ToString(String, IFormatProvider)
- System.SByte.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Int16.ToString(String)
- System.Int16.ToString(String, IFormatProvider)
- System.Int16.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt16.ToString(String)
- System.UInt16.ToString(String, IFormatProvider)
- System.UInt16.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Int64.ToString(String)
- System.Int64.ToString(String, IFormatProvider)
- System.Int64.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt64.ToString(String)
- System.UInt64.ToString(String, IFormatProvider)
- System.UInt64.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Half.ToString(String)
- System.Half.ToString(String, IFormatProvider)
- System.Half.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Single.ToString(String)
- System.Single.ToString(String, IFormatProvider)
- System.Single.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Double.ToString(String)
- System.Double.ToString(String, IFormatProvider)
- System.Double.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Decimal.ToString(String)
- System.Decimal.ToString(String, IFormatProvider)
- System.Decimal.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)