Как мне форматировать число в С# с запятыми и десятичными знаками?

У меня есть число с переменным числом цифр после десятичной точки. Я хочу отформатировать число с запятыми и всеми десятичными числами.

Например: 42,023,212.0092343234

Если я использую ToString ( "N" ), я получаю только 2 десятичных знака, ToString ( "f" ) дает мне все десятичные числа без запятых. Как мне получить оба?

Ответ 1

Не уверен (и не смог проверить прямо сейчас), но что-то вроде этой работы?

"#,##0.################"

Ответ 2

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

даст вам до 12 знаков после запятой.

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

Обратите внимание, что вы ограничены точностью вашей переменной. A double имеет только 15-16 цифр точности, так как ваша левая сторона становится больше, число десятичных знаков будет уменьшаться.

Ответ 3

ОБНОВЛЕНИЕ. Глядя на документацию MSDN по типу System.Double, я вижу следующее:

По умолчанию двойное значение содержит 15 десятичные цифры точности, хотя сохраняется максимум 17 цифр внутри.

Итак, я думаю, pdr на что-то, на самом деле. Просто сделайте следующее:

// As long as you've got at least 15 #s after the decimal point,
// you should be good.
value.ToString("#,#.###############");

Вот идея:

static string Format(double value)
{
    double wholePart = Math.Truncate(value);
    double decimalPart = Math.Abs(value - wholePart);
    return wholePart.ToString("N0") + decimalPart.ToString().TrimStart('0');
}

Пример:

Console.WriteLine(Format(42023212.0092343234));

Вывод:

42,023,212.00923432409763336

Ha, ну, как вы можете видеть, это дает несовершенные результаты, из-за (я думаю) математические проблемы с плавающей запятой. Ну что ж; это вариант, во всяком случае.

Ответ 4

Попробуйте ToString("N2")

Ответ 5

[DisplayFormat (DataFormatString = "{0: 0,0.00}")]

Ответ 6

Вот несколько способов достичь ваших ожиданий...

decimal d = 42023212.0092343234M;

NumberFormatInfo nfi  = (NumberFormatInfo) CultureInfo.InvariantCulture.NumberFormat.Clone();

nfi.NumberDecimalDigits= (d - Decimal.Truncate(d)).ToString().Length-2;

Console.WriteLine(d.ToString("N",nfi));

Подробнее о NumberFormatInfo.. смотрите в MSDN..

http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.aspx