Я хотел бы сгруппировать цифры в два раза по тысяче, но также вывести, однако количество десятичных знаков на самом деле находится в числе. Я не могу понять строку формата.
1000 => 1,000
100000 => 100,000
123.456 => 123.456
100000.21 => 100,000.21
100200.123456 => 100,200.123456
Отказ от ответственности (это не так просто, как вы думаете):
.ToString("n") не работает, округляет цифры




Попробуй это:
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 - это именно то место, где вы можете прочитать, как это сделать.
Кажется, это делает именно то, что вы хотите:
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
Похоже, что это далеко не идеально, но я могу довести его до 12 десятичных знаков, что должно быть пределом для моих целей.
Однако не будет работать с произвольным количеством десятичных знаков. Поскольку double имеет точность 15-16 цифр, хотя "{0: ##, ###, ###, ###, ###, ## 0. ############ ###} "захватывает все возможные двойники со всеми возможными цифрами. Обратите внимание, я предпочитаю 0 в начале.
Спасибо за маску формата Джеймс, отличная работа. Одна вещь, которую мы исправили / добавили, заключалась в том, что когда мы получали 0.1, он просто показывал .1, удаляя 0. Чтобы предотвратить это, мы использовали следующую маску: {0: #, ## 0. ##### #####}
Попробуйте просто использовать "#, #", это добавит запятые для тысяч и др., Но я не знаю, сохранятся ли десятичные дроби, иначе "#, ###. ########### ######### "или любое количество символов '#' после десятичной дроби.
Вы можете создать строку настраиваемого формата .ToString ("###, ###. ######") Строки настраиваемого числового формата
Это может быть немного медленным, но он сделает то, что вы хотите.
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;
}
Голосование против - немного сурово для того, что дает ответ на вопрос: нет? Хотя это не лучшее решение, это решение.
Старая ветка, но ни один из ответов не кажется мне полностью удовлетворительным. Большинство из них превращают ноль в пустую строку, включая строку с наибольшим количеством голосов.
Я думаю, что лучшим решением будет "#,##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.#################"));
}
Если у вас больше 7 знаков после запятой, разве это не приведет к его усечению?