Отформатируйте число с запятыми, но сохраните десятичные знаки

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

 1000 => 1,000
 100000 => 100,000
 123.456 => 123.456
 100000.21 => 100,000.21
 100200.123456 => 100,200.123456

Отказ от ответственности (это не так прямо, как вы думаете):

  • Пожалуйста, не указывайте мне на этот вопрос, он не отвечает на мой вопрос.
  • Не указывайте мне MS DN, статьи мне не помогли. (Если вы считаете, что я читаю их неправильно, прочитайте их сами и опубликуйте правильный ответ)
  • .ToString("n") не работает, он округляет цифры

Ответы

Ответ 1

Это похоже на то, что вы хотите:

public void Code(params string[] args)
{
    Print(1000);
    Print(100000);
    Print(123.456);
    Print(100000.21 );
    Print(100200.123456);
}

void Print(double n)
{
    Console.WriteLine("{0:###,###.#######}", n);
}

1,000
100,000
123.456
100,000.21
100,200.123456

Ответ 2

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

Я думаю, что лучшее решение "#,##0.#################", которое, по крайней мере, показывает нули. Тем не менее, это все еще уродливо. Должен быть лучший способ.

double[] vals = new double[] { 0.0, 0.1234, -0.1234, 1.0, 
                               123456789.123456, 123456789.0, 
                               0.123456789123456 };
foreach (double val in vals) 
{ 
    Console.WriteLine(val + ": " + val.ToString("#,##0.#################")); 
}

Ответ 3

Попробуйте просто "#, #", это добавляет запятые для тысяч и др., но я не знаю, сохранит ли он десятичные знаки, иначе "#, ###. ######## ############" или любое количество символов '#', которые вы хотите после десятичного числа.

Ответ 4

Попробуйте следующее:

VB:

Dim vals() As Double = {1000, 100000, 123.456, 100000.21, 100200.123456}
For Each val As Double in vals
   Console.WriteLine(val.ToString("###,###.#########"))
Next val

С#:

double[] vals = new double[] {1000, 100000, 123.456, 100000.21, 100200.123456};
foreach (double val in vals)
{
    Console.WriteLine(val.ToString("###,###.#########"));
}

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

И ссылка MSDN, которую вы разместили, - это то место, куда вы поехали, чтобы прочитать, как это сделать.

Ответ 6

Это может быть немного медленным, но оно будет делать то, что вы хотите.

public static string FormatNumber(double num)
{
    string s = num.ToString();
    string result = "";

    if(s.IndexOf('.') != -1)
    {
        result = s.Substring(s.IndexOf('.'));
        s = s.Substring(0, s.IndexOf('.'));
    }

    while (s.Length > 3)
    {
        result = "," + s.Substring(s.Length - 3);
        s = s.Substring(0, s.Length - 3);
    }
    if (s.Length == 0)
        return result.Substring(1);
    return s + result;
}