Более простой способ предотвратить отображение чисел в показателях экспоненты - PullRequest
4 голосов
/ 21 октября 2009

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

EDIT:

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

  1. Двойное преобразование в строку без научной записи
  2. Как преобразовать double в строку без представления степени 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"

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

Спасибо!

UPDATE

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

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

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

EDIT

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

1 Ответ

3 голосов
/ 21 октября 2009

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

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

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

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

...