Udostępnij za pośrednictwem


Standardowa precyzja analizowania formatu liczbowego

Platforma .NET obsługuje teraz większe wartości dokładności podczas formatowania liczb jako ciągów przy użyciu elementów ToString i TryFormat.

Uwaga

Maksymalna precyzja została ponownie zmieniona na platformie .NET 7. Aby uzyskać więcej informacji, zobacz Maksymalna precyzja ciągów formatu liczbowego.

Opis zmiany

Podczas formatowania liczb jako ciągów specyfikator dokładności w ciągu formatu reprezentuje liczbę cyfr w wynikowym ciągu. W zależności od specyfikatora formatu, który jest znakiem na początku ciągu, precyzja może reprezentować całkowitą liczbę cyfr, liczbę cyfr znaczących lub liczbę cyfr dziesiętnych.

W poprzednich wersjach platformy .NET standardowa logika analizowania formatu liczbowego jest ograniczona do dokładności 99 lub mniejszej. Niektóre typy liczbowe mają większą precyzję, ale ToString(string format) nie uwidacznia ich poprawnie. Jeśli na przykład określisz precyzję większą niż 99, 32.ToString("C100")ciąg formatu jest interpretowany jako niestandardowy ciąg formatu liczbowego zamiast "waluta z dokładnością 100". W niestandardowych ciągach formatu liczbowego znaki są interpretowane jako literały znaków. Ponadto ciąg formatu zawierający nieprawidłowy specyfikator formatu jest interpretowany inaczej w zależności od wartości precyzji. H99 zgłasza wartość FormatException dla nieprawidłowego specyfikatora formatu, podczas gdy H100 jest interpretowany jako niestandardowy ciąg formatu liczbowego.

Począwszy od platformy .NET 6, platforma .NET obsługuje precyzję do Int32.MaxValue. Ciąg formatu składający się ze specyfikatora formatu z dowolną liczbą cyfr jest interpretowany jako standardowy ciąg formatu liczbowego z dokładnością. Element jest FormatException zgłaszany dla jednego lub obu następujących warunków:

  • Znak specyfikatora formatu nie jest standardowym specyfikatorem formatu.
  • Precyzja jest większa niż Int32.MaxValue.

Ta zmiana została zaimplementowana w logice analizowania, która ma wpływ na wszystkie typy liczbowe.

W poniższej tabeli przedstawiono zmiany zachowania dla różnych ciągów formatu.

Formatowanie ciągu Poprzednie zachowanie Zachowanie platformy .NET 6+
C2 Oznacza walutę z dwiema cyframi dziesiętnymi Określa walutę z dwiema cyframi dziesiętnymi (bez zmian)
C100 Określa niestandardowy ciąg formatu liczbowego, który drukuje "C100" Określa walutę z 100 cyframi dziesiętnymi
H99 Zgłaszany FormatException z powodu nieprawidłowego standardowego specyfikatora formatu "H" Zgłaszany FormatException z powodu nieprawidłowego standardowego specyfikatora formatu "H" (bez zmiany)
H100 Określa niestandardowy ciąg formatu liczbowego Zgłaszany FormatException z powodu nieprawidłowego standardowego specyfikatora formatu "H"

Wprowadzona wersja

.NET 6

Przyczyna wprowadzenia zmiany

Ta zmiana poprawia nieoczekiwane zachowanie w przypadku używania większej dokładności do analizowania formatu liczbowego.

W większości przypadków nie jest wymagana żadna akcja, a prawidłowa precyzja będzie wyświetlana w wynikowych ciągach.

Jeśli jednak chcesz przywrócić poprzednie zachowanie, w którym specyfikator formatu jest interpretowany jako znak literału, gdy precyzja jest większa niż 99, możesz opakowować ten znak w pojedynczych cudzysłowach lub użyć ukośnika odwrotnego. Na przykład w poprzednich wersjach platformy 42.ToString("G999") .NET zwraca wartość G999. Aby zachować to zachowanie, zmień ciąg formatu na "'G'999" lub "\\G999". Będzie to działać w programach .NET Framework, .NET Core i .NET 5+.

Następujące ciągi formatu będą nadal interpretowane jako niestandardowe ciągi formatu liczbowego:

  • Zacznij od dowolnego znaku, który nie jest znakiem alfabetycznym ASCII, na przykład $ lub è.
  • Zacznij od znaku alfabetycznego ASCII, po którym nie następuje cyfra ASCII, na przykład A$.
  • Zacznij od znaku alfabetycznego ASCII, a następnie sekwencji cyfr ASCII, a następnie dowolnego znaku, który nie jest znakiem cyfry ASCII, na przykład A12A.

Dotyczy interfejsów API

Ta zmiana została zaimplementowana w logice analizowania, która ma wpływ na wszystkie typy liczbowe.

Zobacz też