Aracılığıyla paylaş


Standart sayısal biçim ayrıştırma hassasiyeti

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

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.

Ç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ı.

Ayrıca bakınız