Поделиться через


Значение точности при анализе стандартных числовых форматов

Теперь .NET поддерживает более высокую точность при форматировании чисел в виде строк с помощью ToString и TryFormat.

Примечание.

Максимальная точность была изменена снова в .NET 7. Дополнительные сведения см. в разделе "Максимальная точность для строк числовых форматов".

Описание изменения

При форматировании чисел в виде строк описатель точности в строке формата представляет количество цифр в результирующей строке. В зависимости от описателя формата, который является символом в начале строки, точность может представлять общее число цифр, число значащих цифр или число десятичных цифр.

В предыдущих версиях .NET стандартная логика анализа числового формата ограничивалась точностью до 99 или меньше. Некоторые числовые типы имеют большую точность, но ToString(string format) не раскрывает их правильно. Если указать точность более 99, например, 32.ToString("C100"), строка формата интерпретируется как строка настраиваемого числового формата, а не "валюта с точностью 100". В строках настраиваемого числового формата символы обрабатываются как символьные литералы. Кроме того, строка формата, содержащая недопустимый описатель формата, интерпретируется по-разному в зависимости от значения точности. H99 создает исключение FormatException для недопустимого описателя формата, хотя H100 интерпретируется как строка настраиваемого числового формата.

Начиная с .NET 6 поддерживается точность до Int32.MaxValue. Строка формата, состоящая из описателя формата с любым количеством цифр, интерпретируется как строка стандартного числового формата с точностью. Исключение FormatException создается при выполнении одного или сразу двух из следующих условий:

Это изменение было реализовано в логике анализа, которая влияет на все числовые типы.

В следующей таблице показаны изменения в поведении для различных строк формата.

Строка форматирования Прежнее поведение Поведение .NET 6+
C2 Обозначает валюту с двумя десятичными цифрами Обозначает валюту с двумя десятичными цифрами (без изменений)
C100 Обозначает строку настраиваемого числового формата, которая выводит "C100" Обозначает валюту со 100 десятичными цифрами
H99 Вызывается исключение FormatException из-за недопустимого описателя стандартного формата "H" Вызывается исключение FormatException из-за недопустимого описателя стандартного формата "H" (без изменений)
H100 Обозначает строку настраиваемого числового формата Вызывается исключение FormatException из-за недопустимого описателя стандартного формата "H"

Представленные версии

.NET 6

Причина изменения

Это изменение исправляет непредвиденное поведение при использовании большой точности для синтаксического анализа числовых форматов.

В большинстве случаев никаких действий не требуется, и в результирующих строках отображается правильная точность.

Однако если вы хотите вернуться к предыдущему поведению, когда описатель формата интерпретируется как литеральный символ при превышении точности 99, можно заключить этот символ в одинарные кавычки или экранировать его обратной косой чертой. Например, в предыдущих версиях .NET 42.ToString("G999") возвращает G999. Чтобы сохранить это поведение, измените строку формата на "'G'999" или "\\G999". Это будет работать на платформах .NET Framework, .NET Core и .NET 5+.

Следующие строки формата будут по прежнему интерпретироваться как строки настраиваемых числовых форматов:

  • Начинающиеся с любого символа, который не является алфавитным символом ASCII, например, $ или è.
  • Начинающиеся с алфавитного символа ASCII, за которым не следует цифра ASCII, например A$.
  • Начинающиеся с алфавитного символа ASCII, за которым следует последовательность цифр ASCII, а затем любой символ, который не является цифрой ASCII, например A12A.

Затронутые API

Это изменение было реализовано в логике анализа, которая влияет на все числовые типы.

См. также