Ваш ввод - String, а не Double, поэтому он форматируется как строка: в этом случае форматирование не знает о десятичных разрядах.
Вы можете использовать Double.Parse()
для преобразования строки в значение Double, но позаботьтесь об использовании правильной культуры.
Другое дело, есть ли конкретная причина не использовать более естественный формат {0: 0,00} в обоих случаях? Если вы действительно хотите использовать заполнитель для цифр, тогда # в порядке, в противном случае лучше всего 0.
Проверенное решение (будьте осторожны, оно усекается, а не округляется). Мне нужно было некоторое время, чтобы понять, чего на самом деле нужно:
public static string ReturnFormat(string input, int maxLength, int decimalPrecision)
{
if (input.Length <= maxLength)
return input;
Char separator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
string[] inputs = input.Split(separator);
// NB: truncating rather than rounding
if (inputs[1].Length > decimalPrecision)
inputs[1] = inputs[1].Substring(0, decimalPrecision);
int digits = (maxLength - decimalPrecision - 1);
// NB: truncating rather than rounding, adding ~ to signalize the
// presence of missing significant digits
if (inputs[0].Length > digits)
inputs[0] = inputs[0].Substring(0, digits-1) + "~";
return inputs[0] + separator + inputs[1];
}