Отформатируйте число с запятыми, но сохраните десятичные знаки
Я хотел бы группировать цифры в два раза на тысячи, но также выводить, однако число десятичных чисел на самом деле находится в числе. Я не могу понять строку формата.
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, которую вы разместили, - это то место, куда вы поехали, чтобы прочитать, как это сделать.
Ответ 5
Вы можете создать строку пользовательского формата .ToString( "###, ###. ######" )
Пользовательские строки числового формата
Ответ 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;
}