2012-01-18 1 views
2

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

я скачал исходники и в JsonConvert.cs - JsonConvert.ToString (дважды), я вижу линию:

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

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

ответ

3

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

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

value.ToString("F8"); // will be 8 digits 
1

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

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

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