числовое форматирование "R" в Json.NET - PullRequest
2 голосов
/ 19 января 2012

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 19 января 2012

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

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

value.ToString("F8"); // will be 8 digits
1 голос
/ 19 января 2012

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

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

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

...