2010-01-26 3 views
0

У меня есть следующий метод:Формат строки Выпуск

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 

Теперь моя проблема в том, что входная строка не отформатирован хорошо, по-прежнему формат strig выглядит нормально. Любые идеи о том, что я делаю неправильно?

+0

Что ваш разыскиваемый выход? –

+0

Выход я хотел бы быть 1234568.12 – wikiz

+1

Кроме того, это очень странная функция формата, и мне сложно понять, когда это будет необходимо. –

ответ

2

Ваш ввод - это строка, не двойная, поэтому она форматируется как строка: форматирование не знает о десятичных знаках в этом случае.

Вы можете использовать Double.Parse(), чтобы преобразовать строку в двойное значение, но позаботьтесь о правильной культуре.

Другое дело, существует ли конкретная причина не использовать более естественный формат {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]; 
} 
+0

OK, Итак, я использовал Double.Parse(), и он работает нормально в 1-м случае (12.3456789011243 возвращает 12.35), но не работает должным образом на 2-м (12345678901.1243 возвращает то же) Тем не менее, формат в порядке, я думаю ({0: #######. 00}) во втором случае. – wikiz

+0

# являются заполнителями, это ловушка, см. Мой обманщик на http://color-of-code.de/index.php?option=com_content&view=article&id=58:c-format-strings&catid=38:programming&Itemid=66 – jdehaan

+0

Не стесняйтесь обращаться ко мне за другими вопросами или комментариями относительно форматирования, я стараюсь держать этот лист актуальным. Я думаю, что вы будете более счастливы с 0.00 как строка формата вместо того, чтобы делать это сложное вычисление строки формата. – jdehaan