числовое форматирование R в Json.NET

Я использую Json.NET для вывода файла JSON, читаемого в блокноте. Результат почти идеален, за исключением того, что очень маленькие числа (-0,000004) преобразуются в экспоненциальное представление. Это не мое намерение.

Скачал исходники и в JsonConvert.cs - JsonConvert.ToString(double) вижу строчку:

value.ToString("R", CultureInfo.InvariantCulture)

Согласно документации по числовому форматированию С#, «R» должен гарантировать двустороннюю передачу, а не преобразование в экспоненциальное представление, но это так. Я изменил строку формата на "0.############", и она отлично работает. Но правильный ли это подход?


person knd    schedule 18.01.2012    source источник


Ответы (2)


Я бы сказал, что да, «0.#############» — правильный подход, потому что он работает, его легко понять и, согласно документацию, формат Round-Trip может использовать или не использовать экспоненциальное представление. Единственная гарантия заключается в том, что «числовое значение, преобразованное в строку, будет преобразовано обратно в то же числовое значение». Я ничего не вижу в том, чтобы не использовать научную нотацию.

Если вы хотите, чтобы это всегда было определенное количество цифр, вы можете использовать Фиксированная точка.

value.ToString("F8"); // will be 8 digits
person Trystan Spangler    schedule 19.01.2012

Как библиотека общего назначения, я думаю, что JSON.NET делает правильные вещи, используя двусторонний формат. Это гарантирует, что никакая информация не будет потеряна. С практической точки зрения экспоненциальное представление может быть намного короче, чем десятичное (для 1e-200 потребуется более 200 символов), так что, опять же, кажется, что такой подход к реализации двустороннего формата является правильным.

Сказав это, ваше использование также полностью допустимо. Однако изменение исходного кода сторонней библиотеки сопряжено со своими проблемами. Каждый раз, когда вы получаете новую версию JSON.NET, вы должны применять одно и то же изменение. В какой-то момент внутренняя работа библиотеки может измениться, и тогда это исправление перестанет работать.

На мой взгляд, лучше всего работать с тем, что у вас есть, если вы можете. В этом случае вы можете написать собственный преобразователь и применить JsonConverter. атрибут вашей собственности. Это действительно легко сделать: существующие преобразователи даты/времени должны дать вам фору.

person Jeffrey Sax    schedule 19.01.2012