Более простой способ предотвратить отображение чисел в экспоненциальной записи

Я собираюсь положиться на поговорку, что ни один вопрос не является глупым вопросом, но у меня есть немного глупый вопрос.

ИЗМЕНИТЬ:

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

  1. Двойное преобразование в строку без научной нотации
  2. Как преобразовать двойной строка без силы до 10 представления (E-05)
  3. Место с ответом (Джон Скит): http://www.yoda.arachsys.com/csharp/DoubleConverter.cs

Исходный вопрос:

У меня есть приложение, которое иногда хранит прилично маленькие числа, например 0.000023425. Эти числа загружаются в элементы управления TextBox для редактирования пользователями. Следующий надуманный пример показывает мою проблему:

Dim number As Double = 0.000023425
someTextBox.Text = number.ToString() ' Shows "2.3425E-05"

Как уже упоминалось, отображается текст 2.3425E-05, который не совсем интуитивно понятен пользователю, плюс у меня есть еще более точные числа (до 19 знаков после запятой). Я хотел бы, чтобы выход был фиксированной точкой. Конечно, я мог бы легко и чисто сделать:

number.ToString("F20") ' Shows "0.00002342500000000000"

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

number.ToString("#,##0.####################") ' Shows "0.000023425"

Это то, что я хочу, но есть ли лучший способ сделать это, чем иметь эту гигантскую уродливую строку формата? Итак, ладно, это не так безобразно, но наверняка есть другой способ, верно? Моя цель - показать необработанное значение, хранящееся в БД, в дружественной форме, и я бы предпочел вообще не навязывать формат числа.

Спасибо!

ОБНОВЛЕНИЕ

Возможно, я слишком много сказал в посте. После некоторых экспериментов я обнаружил, что изменение базового типа данных на Decimal решает проблему.

Dim number As Decimal = 0.000023425
someTextBox.Text = number.ToString() ' Shows "0.000023425" instead of "2.3425E-05"

Получается, что Double недостаточно точны для нормального отображения?

ИЗМЕНИТЬ

Я нашел сообщение (хотя и без голосов), в котором значение Double просто преобразуется в десятичное число, а затем применяется к нему .ToString(), что дает желаемый эффект. Есть ли причина, по которой я не хотел бы этого делать? Возможно, приведение к Decimal может закончиться значением, отличным от Double (даже если это незначительная величина), поэтому, возможно, строка формата #,##0.#################... безопаснее.


person Cᴏʀʏ    schedule 21.10.2009    source источник
comment
Вы имели в виду что-то вроде number.ToString(F09)   -  person madan    schedule 21.10.2009
comment
Взгляните на это-stackoverflow .com/questions/1546113/. Класс полезности Джона Скита выглядит многообещающе.   -  person RichardOD    schedule 21.10.2009
comment
О, и, кстати, это определенно НЕ глупый вопрос!   -  person RichardOD    schedule 21.10.2009
comment
У меня это как пример. Моя цель - не форматировать число, чтобы оно отображалось правильно.   -  person Cᴏʀʏ    schedule 22.10.2009
comment
@RichardOD: служебный класс Джона - это именно то решение, которое я хотел, хотя это кажется излишним. Мне действительно не нужно 19+ цифр точности, и база данных в любом случае не собирается принимать что-либо большее, чем двойная точность (да и не нужно). Если вы измените свой комментарий на ответ, я с радостью приму его как ответ.   -  person Cᴏʀʏ    schedule 22.10.2009


Ответы (1)


Сделайте строку формата константой (скажем, в файле ресурсов) и используйте ее по имени. Вы избегаете уродливого формата и получаете согласованность от элемента управления к элементу управления в своем формате (т. е., если вы передумаете, все элементы управления приобретут новый вид).

В качестве альтернативы (или в сочетании) создайте пользовательский элемент управления из текстового поля и создайте свойства, которые вызывают различные строки форматирования, которые вы хотите использовать в более простом синтаксисе.

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

Мы делаем что-то подобное, создавая текстовые элементы управления «процент» и «валюта», которые инкапсулируют все требования к форматированию и синтаксическому анализу. В противном случае они работают так же, как текстовые элементы управления.

person Godeke    schedule 21.10.2009
comment
Очевидно, то, что вы нашли, проще. Double не так точен, как Decimal (который предназначен для работы с десятичными суммами в валюте без проблем с двоичным округлением). Я подозреваю, что если вы только выставляете напоказ, в большинстве случаев это сработает. Однако у double возникают проблемы, если вы выполняете вычисления, в которых вы получаете результат типа 0.9999999 вместо 1.0 . Если это не проблема, бросков будет достаточно. Тем не менее, наличие специального контроля над процентами и валютой избавляет от множества догадок и избыточности. - person Godeke; 22.10.2009
comment
Чтобы ответить на вопрос, почему... средство форматирования по умолчанию (которое использует ToString()) переключается на научный за пределами довольно узкого диапазона. Вот почему вы должны использовать явный формат, чтобы получить то, что вы хотите. (На самом деле вы не конвертируете одно в другое, это просто разные выходные представления одного и того же.) - person Godeke; 22.10.2009