Center and split line with maxchar

I have many hours thinking how I can solve this is my funtion:

private String TextAlignCenter(String Line) { String CenterLine = String.Empty; if (Line.Length > 36) { for (int i = 0; i < Line.Length; i += 36) { if ((i + 36) < Line.Length) TextAlignCenter(Line.Substring(i, 36)); else TextAlignCenter(Line.Substring(i)); } } else { Int32 CountLineSpaces = (int)(36 - Line.Length) / 2; for (int i = 0; i < CountLineSpaces; i++) { CenterLine += (Char)32; } CenterLine += Line; } Console.WriteLine(CenterLine); return CenterLine; } 

This function splits a string of 36 characters, then adds the resulting characters with spaces to create centralized text: For example:

 string x = "27 Calle, Col. Ciudad Nueva, San Pedro Sula, Cortes"; TextAlignCenter(x); 

Result:

 Line1: 27 Calle, Col. Ciudad Nueva, San Ped Line2: ro Sula, Cortes Line3:[EmptyLine] 

Line1 and Line2 are correct, but I do not need line 3, how can I prevent this unnecessary line from printing?

UPDATE:

Lines are added to ArrayList ()

 ArrayList Lines = new ArrayList(); string x = "27 Calle, Col. Ciudad Nueva, San Pedro Sula, Cortes"; Lines.Add(TextAlignCenter(x)); Console.WriteLine(Lines.Count); 
+6
source share
3 answers

All you need is a loop for full fragments and a special condition for the latter:

  public static IEnumerable<String> SplitByLength(String value, int size, // you may want to set default for size, ie "size = 36" Char padding = ' ') { if (String.IsNullOrEmpty(value)) yield break; // or throw an exception or return new String(padding, size); if (size <= 0) throw new ArgumentOutOfRangeException("size", "size must be a positive value"); // full chunks with "size" length for (int i = 0; i < value.Length / size; ++i) yield return value.Substring(i * size, size); // the last chunk (if it exists) should be padded if (value.Length % size > 0) { String chunk = value.Substring(value.Length / size * size); yield return new String(padding, (size - chunk.Length) / 2) + chunk + new String(padding, (size - chunk.Length + 1) / 2); } } ... String source = "27 Calle, Col. Ciudad Nueva, San Pedro Sula, Cortes"; // I've set padding to '*' in order to show it // 27 Calle, // Col. Ciuda // d Nueva, S // an Pedro S // ula, Corte // ****s***** Console.Write(String.Join(Environment.NewLine, SplitByLength(source, 10, '*'))); 

Your sample:

  string x = "27 Calle, Col. Ciudad Nueva, San Pedro Sula, Cortes"; List<String> lines = SplitByLength(x, 36).ToList(); 
+3
source

You do not need a recursive function here. Also, some operations are not optimal.

 private static String TextAlignCenter(String Line) { int len = 36; // avoid magic numbers StringBuilder b = new StringBuilder(); String CenterLine = String.Empty; for (int i = 0; i < Line.Length; i += len) { if ((i + len) < Line.Length) b.AppendLine(Line.Substring(i, len)); // add new line at the end else { CenterLine = Line.Substring(i); int CountLineSpaces = (len - CenterLine.Length) / 2; // new string(' ', CountLineSpaces) replicates ' ' CountLineSpaces times CenterLine = new string(' ', CountLineSpaces) + CenterLine; b.Append(CenterLine); // string tail, no new line } } Console.WriteLine(b.ToString()); return b.ToString(); } 

violin demonstration

+2
source

I would go instead of Console.Write :

 private void TextAlignCenter(String Line) { String CenterLine = String.Empty; if (Line.Length > 36) { for (int i = 0; i < Line.Length; i += 36) { if ((i + 36) < Line.Length) TextAlignCenter(Line.Substring(i, 36)); else TextAlignCenter(Line.Substring(i)); } } else { Int32 CountLineSpaces = (36 - Line.Length) / 2; for (int i = 0; i < CountLineSpaces; i++) { CenterLine += (Char)32; } CenterLine += Line + Environment.NewLine; } Console.Write(CenterLine); } 
+1
source

All Articles