Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
.NET artık sayıları ToString
ve TryFormat
kullanarak dize olarak biçimlendirirken daha büyük hassasiyet değerlerini destekliyor.
Uyarı
.NET 7'de en yüksek duyarlık yeniden değiştirildi. Daha fazla bilgi için bkz. Sayısal biçim dizeleri için en yüksek duyarlık.
Açıklamayı değiştir
Sayıları dize olarak biçimlendirirken, biçim dizesindekiduyarlık tanımlayıcısı, sonuçta elde edilen dizedeki basamak sayısını temsil eder. Dizenin başındaki karakter olan biçim tanımlayıcıya bağlı olarak, duyarlık toplam basamak sayısını, önemli basamak sayısını veya ondalık basamak sayısını gösterebilir.
Önceki .NET sürümlerinde, standart sayısal biçim ayrıştırma mantığı 99 veya daha az bir duyarlıkla sınırlıdır. Bazı sayısal türlerin duyarlığı daha fazladır, ancak ToString(string format)
bunu doğru şekilde göstermez. Örneğin, 99'dan büyük bir kesinlik belirtirseniz, 32.ToString("C100")
format dizesi "kesinliği 100 olan para birimi" yerine özel sayısal bir format dizesi olarak yorumlanır. Özel sayısal biçim dizelerinde karakterler karakter sabitleri olarak yorumlanır. Ayrıca, geçersiz biçim tanımlayıcısı içeren bir biçim dizesi, duyarlık değerine bağlı olarak farklı yorumlanır.
H99
geçersiz biçim tanımlayıcısı için bir FormatException oluşturur, ancak H100
özel sayısal biçim dizesi olarak yorumlanır.
.NET 6'dan itibaren, .NET Int32.MaxValue seviyesine kadar hassasiyeti destekler. Herhangi bir sayıda basamağı olan bir biçim belirticiden oluşan biçim dizesi, duyarlıklı standart bir sayısal biçim dizesi olarak yorumlanır. Aşağıdaki koşullardan biri veya her ikisi için A FormatException oluşturulur:
- Biçim belirtici karakteri standart bir biçim tanımlayıcısı değildir.
- Hassasiyet Int32.MaxValue değerinden büyüktür.
Bu değişiklik, tüm sayısal türleri etkileyen ayrıştırma mantığında uygulandı.
Aşağıdaki tabloda çeşitli biçim dizeleri için davranış değişiklikleri gösterilmektedir.
Dizeyi biçimlendir | Önceki davranış | .NET 6+ davranışı |
---|---|---|
C2 |
İki ondalık basamağı olan para birimini belirtir | İki ondalık basamağı olan para birimini belirtir (değişiklik yok) |
C100 |
"C100" yazdıran özel sayısal biçim dizesini belirtir | 100 ondalık basamağı olan para birimini belirtir |
H99 |
Geçersiz standart biçim tanımlayıcısı "H" nedeniyle FormatException hatası atar. | Geçersiz standart biçim tanımlayıcısı "H" nedeniyle hata verir (FormatException) |
H100 |
Özel sayısal biçim dizesini belirtir | Geçersiz standart biçim tanımlayıcısı "H" nedeniyle FormatException hatası atar. |
Sürüm kullanıma sunulmuştur
.NET 6
Değişiklik nedeni
Bu değişiklik, sayısal biçim ayrıştırma için daha yüksek duyarlık kullanılırken beklenmeyen davranışı düzeltiyor.
Önerilen eylem
Çoğu durumda herhangi bir eylem gerekmez ve sonuç dizelerinde doğru kesinlik gösterilir.
Ancak, hassasiyet 99'dan büyük olduğunda biçim belirticinin değişmez karakter olarak yorumlandığı önceki davranışa geri dönmek istiyorsanız, bu karakteri tek tırnak içine alabilir veya ters eğik çizgiyle gizleyebilirsiniz. Örneğin, önceki .NET sürümlerinde 42.ToString("G999")
geriye G999
döner. Bu davranışı korumak için biçim dizesini "'G'999"
veya "\\G999"
olarak değiştirin. Bu, .NET Framework, .NET Core ve .NET 5+ üzerinde çalışır.
Aşağıdaki biçim dizeleri, özel sayısal biçim dizeleri olarak yorumlanmaya devam edecek.
- Örneğin,
$
ASCII alfabetik karakter olmayan herhangi bir karakterle başlayın.è
- ASCII rakamı tarafından takip edilmeyen bir ASCII alfabetik karakterle başlayın, örneğin.
A$
- ASCII alfabetik bir karakterle, ardından ASCII basamak dizisiyle başlayın ve ardından ASCII basamak karakteri olmayan herhangi bir karakterle başlayın. Örneğin,
A12A
.
Etkilenen API'ler
Bu değişiklik, tüm sayısal türleri etkileyen ayrıştırma mantığında uygulandı.
- 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)