Форматирование двойной в виде строки в C #

голоса
9

У меня есть Double, который может иметь значение от около 0.000001 до 1,000,000,000.000

Я хочу, чтобы отформатировать этот номер в виде строки, но условно в зависимости от его размера. Так что, если это очень мало, я хочу, чтобы отформатировать его с чем-то вроде:

String.Format({0:.000000000}, number);

если это не так уж мало, скажем, 0,001, то я хочу использовать что-то вроде

String.Format({0:.00000}, number);

и если это закончится, скажем, 1000 затем отформатировать его как:

String.Format({0:.0}, number);

Есть умный способ построить эту строку формата, исходя из размера стоимости я собираюсь форматировать?

Задан 10/12/2008 в 04:36
источник пользователем
На других языках...                            


5 ответов

голоса
15

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

string s;
double epislon = 0.0000001; // or however near zero you want to consider as zero
if (Math.Abs(value) < epislon) {
    int digits = Math.Log10( Math.Abs( value ));
    // if (digits >= 0) ++digits; // if you care about the exact number
    if (digits < -5) {
       s = string.Format( "{0:0.000000000}", value );
    }
    else if (digits < 0) {
       s = string.Format( "{0:0.00000})", value );
    }
    else {
       s = string.Format( "{0:#,###,###,##0.000}", value );
    }
}
else {
    s = "0";
}

Или построить его динамически на основе количества цифр.

Ответил 10/12/2008 в 04:48
источник пользователем

голоса
2

Вслед за OwenP (и на «расширение» tvanfosson):

Если это общее достаточно, и вы на C # 3.0, я бы превратить его в метод расширения на двойной:

class MyExtensions 
{
    public static string ToFormmatedString(this double d)
    {
        // Take d and implement tvanfosson's code
    }
}

Теперь в любом месте у вас есть двойник вы можете сделать:

double d = 1.005343;
string d_formatted = d.ToFormattedString();
Ответил 11/04/2009 в 19:49
источник пользователем

голоса
2

Первые два String.Format в вашем вопросе может быть решены путем автоматического удаления конечных нулей:

String.Format("{0:#,##0.########}", number);

И последнее, вы можете решить, позвонив Math.Round (номер, 1) для значений более 1000, а затем использовать тот же String.Format.

Что-то вроде:

String.Format("{0:#,##0.########}", number<1000 ? number : Math.Round(number,1));
Ответил 10/12/2008 в 14:53
источник пользователем

голоса
2

Используйте символ # для дополнительных позиций в строке:

string.Format("{0:#,###,##0.000}", number);

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

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

Ответил 10/12/2008 в 04:42
источник пользователем

голоса
1

Если бы это было мне, я бы написать пользовательский класс обертку и поместить код tvanfosson в в его ToStringметоде. Таким образом , вы можете по- прежнему работать с двойным значением, но вы получите правильное строковое представление всего о всех случаях. Было бы выглядеть примерно так:

class FormattedDouble
{ 
    public double Value { get; set; }

    protected overrides void ToString()
    {
        // tvanfosson's code to produce the right string
    }
}

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

var myDouble = new FormattedDouble();
myDouble.Value = Math.Pi;
Console.WriteLine(myDouble);
Ответил 11/12/2008 в 00:36
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more