Вы можете написать это так, сгенерировав строку стандартного формата и затем используя ее:
public static string Format(decimal input, int width, int precision)
{
var format = string.Format("{{0,{0}:F{1}}}", width, precision);
// generates (e.g. width=15, precision=5) "{0,15:F5}"
// then format using this and replace padding with zeroes
return string.Format(format, input).Replace(" ", "0");
}
Или вместо того, чтобы дважды вызывать формат, просто объедините строку формата, в зависимости от ваших предпочтений:
string.Format("{0," + width + ":F" + precision + "}", input).Replace(" ","0")
Вы должны заменить пробелы после этого, так как нет способа указать символ заполнения. В качестве альтернативы вы можете написать свой собственный форматер для pad с определенным символом. Это работает, хотя:)
Редактировать: Это соответствует оригиналу для всех входов, кроме случаев, когда precision = 0
. В этом случае оригинал неверен, поскольку он считает десятичную точку как часть ширины, даже если ее нет.
Упс: Забыл проверить отрицательные числа.
Вот более простая версия, но нужно проверить, является ли число отрицательным, чтобы получить правильное заполнение:
public override string Format(decimal input, int width, int precision)
{
var output = input.ToString("F" + precision);
return input < 0
? "-" + output.Substring(1).PadLeft(width, '0')
: output .PadLeft(width, '0');
}