Проблема формата строки - PullRequest
       10

Проблема формата строки

0 голосов
/ 26 января 2010

У меня есть следующий метод:

public static string ReturnFormat(string input, int maxLength, int decimalPrecision, char formatChar)
  {
   string[] format = new string[2];
   string[] inputs = new string[2];

   inputs = input.Split(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0]);

   if (input.Length > maxLength)
   {
    int offset = 0;
    int counter = 0;

    if (inputs[0].Length > maxLength - (1 + decimalPrecision))
    {
     offset = maxLength - (1 + decimalPrecision);
    }
    else
     offset = inputs[0].Length;

    for (int i = 0; i < offset; i++)
    {
     format[0] += formatChar;

     if (counter < decimalPrecision)
     {
      format[1] += '0';
      counter++;
     }
    }

    System.Windows.Forms.MessageBox.Show("{0:" + format[0] + "." + format[1] + "}");
    return String.Format(CultureInfo.CurrentCulture, "{0:" + format[0] + "." + format[1] + "}", input);
   }
   else
    return input;
  }

Который говорит, что я использую как:

ReturnFormat("12.3456789011243", 10, 2, '#') // format is {0:##.00} // output 12.3456789011243
ReturnFormat("12345678901.1243", 10, 2, '#') // format is {0:#######.00} // output 12345678901.1243

Теперь моя проблема в том, что строка ввода не отформатирована должным образом,Тем не менее формат стрига, кажется, в порядке.Есть идеи, что я делаю не так?

1 Ответ

2 голосов
/ 26 января 2010

Ваш ввод - 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];
}
...