Как мне отформатировать десятичное число в число программно управляемых десятичных знаков в c #? - PullRequest
7 голосов
/ 15 апреля 2009

Как я могу отформатировать число с фиксированным числом десятичных знаков (сохранить конечные нули), где число мест определяется переменной?

например.

int x = 3;
Console.WriteLine(Math.Round(1.2345M, x)); // 1.234 (good)
Console.WriteLine(Math.Round(1M, x));      // 1   (would like 1.000)
Console.WriteLine(Math.Round(1.2M, x));    // 1.2 (would like 1.200)

Обратите внимание, что, так как я хочу контролировать количество мест программно, эта строка. Формат не будет работать (конечно, я не должен генерировать строку формата):

Console.WriteLine(
    string.Format("{0:0.000}", 1.2M));    // 1.200 (good)

Должен ли я просто включить Microsoft.VisualBasic и использовать FormatNumber ?

Надеюсь, здесь что-то упущено.

Ответы [ 5 ]

12 голосов
/ 15 апреля 2009

Попробуйте

decimal x = 32.0040M;
string value = x.ToString("N" + 3 /* decimal places */); // 32.004
string value = x.ToString("N" + 2 /* decimal places */); // 32.00
// etc.

Надеюсь, это работает для вас. Смотри

http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

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

public static string ToRoundedString(this decimal d, int decimalPlaces) {
    return d.ToString("N" + decimalPlaces);
}

Тогда вы можете просто позвонить

decimal x = 32.0123M;
string value = x.ToRoundedString(3);  // 32.012;
4 голосов
/ 15 апреля 2009

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

Console.WriteLine(string.Format(string.Format("{{0:0.{0}}}", new string('0', iPlaces)), dValue))

По шагам

//Set the value to be shown
decimal dValue = 1.7733222345678M;

//Create number of decimal places
int iPlaces = 6;

//Create a custom format using the correct number of decimal places
string sFormat = string.Format("{{0:0.{0}}}", new string('0', iPlaces));

//Set the resultant string
string sResult = string.Format(sFormat, dValue);
2 голосов
/ 15 апреля 2009

См. Эти ссылки для справки формата строки:
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

Вы хотите это:

Console.WriteLine(Math.Round(1.2345M, x).ToString("F" + x.ToString()));

Кроме того, при необходимости округляется вызов .ToString, поэтому вы можете пропустить вызов Math.Round и просто сделать это:

Console.WriteLine(1.2345M.ToString("F" + x.ToString()));
1 голос
/ 15 апреля 2009

Примерно так должно с этим справиться:

int x = 3;
string format = "0:0.";
foreach (var i=0; i<x; i++)
    format += "0";
Console.WriteLine(string.Format("{" + format + "}", 1.2M));
0 голосов
/ 15 апреля 2009

Способ сделать это:

private static string FormatDecimal(int places, decimal target)
        {
            string format = "{0:0." + string.Empty.PadLeft(places, '0') + "}";
            return string.Format(format, target); 
        }
...