Вставка определенного пользователем количества пробелов до и после строки с помощью C#

Я использую string builder для форматирования моей строки для добавления и добавления пробелов в начале и конце строки

вот что у меня пока есть:

private void button1_Click(object sender, EventArgs e)
{
   String Word = textBox1.Text;
   AppendPrependText(Word);
}
private void AppendPrependText (String Word)
{
   int count = Convert.ToInt32(textBox2.Text);
   int WordCount = Word.Count();
   int totalChar = count + WordCount;
   string format = "{-"+totalChar+ "," +totalChar+ "}";
   StringBuilder sb = new StringBuilder();

   sb.AppendLine(string.Format(format, Word));
   textBox3.Text = sb.ToString();
}

но я получаю неправильный формат ошибки. Что я делаю не так?

6 ответов


Я думаю, что вам не нужно использовать отдельную операцию для форматирования строки, вы можете использовать .AppendFormat() метод StringBuilder Class. Вот пример кода:

StringBuilder sbAppendFormat = new StringBuilder();
int numberOfSpaces=0;
if(int.TryParse(textBo2.Text, out numberOfSpaces))
{
    string whiteSpaceSequence= new string(' ',numberOfSpaces);
    sbAppendFormat.AppendFormat("{0}{1}{0}", whiteSpaceSequence, "This is your String");
}
textBox3.Text = sbAppendFormat.ToString();

Примечание:- предположим, что вам нужно добавить некоторые пробелы(пусть это будет 5) до и после конкретного слова.


здесь есть две проблемы. Во-первых, вы правильно используете StringBuilder для форматирования строки, которая уменьшает накладные расходы, вызванные конкатенацией, но вы и выполнение дополнительной конкатенации на этом format локальная переменная.

вторая проблема заключается в том, что ваша строка формата неверна: она не включает индекс аргумента. Ваш метод ожидает одно слово, так что индекс должен быть равен нулю перед инструкцией заполнения.

к счастью, вы может пропустить конкатенацию строки формата и просто добавить определяемое пользователем пространство (или любой символ) к новому экземпляру StringBuilder


ваш код имеет некоторые ошибки:

Format Exception будет брошен этой линией наверняка:

sb.AppendLine(string.Format(format, Word));

ваш текущий формат не содержит каких-либо {0}, в котором Word значение должно быть заменено.

//you should put here somewhere {0} in the format or remove the Word for string.Format
//for an example
string format = "{-" + totalChar + "," + totalChar + "}{0}";

также эта строка возможна Format Exception если textBox2.Text для примера a11:

int count = Convert.ToInt32(textBox2.Text);

вам нужно использовать int.TryParse

int count = 0;
int.TryParse(textBo2.Text, out count);

в чем проблема

string format = "{-"+totalChar+ "," +totalChar+ "}";

Пусть говорят, если totalChar = 10; чем

format = "{-10,10}"

который не является допустимым форматом, тогда как он должен быть

{0,10}{1,10}

и таким образом, ваша строка будет выглядеть как

Console.WriteLine(string.Format("{0,10}{1,10}", "Mohit",""));

третий аргумент был намеренно оставлен пустым, чтобы ничего не было напечатано после слова. но у вас будет 10 мест.

но я бы рекомендовал вам использовать String.PadRight и String.PadLeft.

пример демострации вашей задачи с помощью PadLeft и PadRight

int count = 5;
string st = "mohit ";
int WordCount = st.Count();
int totalChar = count + WordCount;

st = st.PadRight(totalChar, ' ');
st = st.PadLeft(totalChar + count, ' ');
Console.WriteLine(st);

для простого добавления пробелов или символов, спереди и/или сзади, прокладка будет работать нормально.

private void button1_Click(object sender, EventArgs e)    
{
    int amount;
    int.TryParse(textBox2.Text, out amount);

    var str = textBox1.Text.PadLeft(amount + textBox1.TextLength);
    str = str.PadRight(amount + str.Length);

    textBox3.Text = str;
}

тогда вы можете выбрать прокладку (помещается пробел, и тогда) также позже, если это необходимо / хотел

var str = textBox1.Text.PadLeft(amount + textBox1.TextLength, '>');
str = str.PadRight(amount + str.Length, '<');

дополнительно с дополнительным методом:

private void button1_Click(object sender, EventArgs e)    
{
    textBox3.Text = Format(textBox1.Text, textBox2.Text);
}

private string Format(string word, string spaces)
{
    int amount;
    int.TryParse(spaces, out amount);

    var str = word.PadLeft(amount + word.Length);
    str = str.PadRight(amount + str.Length);
    return str;
}

Я не использую StringBuilder Я вернулся String С AppendPrependText. Оператор if проверяет наличие недопустимого целочисленного ввода в textBox2, если его недопустимое возвращает исходную строку. Если это допустимое целое число, создайте padString С count количество пробелов затем возвращает исходную строку, зажатую между двумя из padStrings.

EDIT: добавлена проверка отрицательных чисел путем добавления и count > 0 к оператору if.

private String AppendPrependText(String Word)
{
  int count = 0;
  if (int.TryParse(textBox2.Text, out count) && count > 0)
  {
    String padString = "".PadLeft(count, ' ');
    return padString + Word.ToString() + padString;
  }
  else
  {
    return Word;
  }
}

private void button1_Click_1(object sender, EventArgs e)
{
  String Word = textBox1.Text;
  textBox3.Text = ">" + AppendPrependText(Word) + "<";
}