2008-11-17 2 views
15

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

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

Disclaimers (это не так просто, как вы думаете):

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

ответ

10

Это, кажется, делает именно то, что вы хотите:

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 
+0

Если у вас есть более 7 знаков после запятой, не будет ли это усекать его? – MusiGenesis 2008-11-17 15:43:56

+0

Похоже, что это не идеальное, но я могу вытолкнуть его до 12 знаков после запятой, что должно быть предел для моих целей. – 2008-11-17 15:45:27

0

Попробуйте это:

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 

C#

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

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

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

1

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

0

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

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; 
} 
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.#################")); 
} 
Смежные вопросы