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 split a string in parts of 36 characters then add the resultant characters with spaces for make a centered 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 dont need the Line3, how i can prevent to print this unnecessary line?
UPDATE:
The lines are added into a ArrayList()
ArrayList Lines = new ArrayList();
string x = "27 Calle, Col. Ciudad Nueva, San Pedro Sula, Cortes";
Lines.Add(TextAlignCenter(x));
Console.WriteLine(Lines.Count);
Use the Split method when the substrings you want are separated by a known delimiting character (or characters). Regular expressions are useful when the string conforms to a fixed pattern. Use the IndexOf and Substring methods in conjunction when you don't want to extract all of the substrings in a string.
Split method, which is not to trim white-space characters and to include empty substrings.
All you need is a loop for full chunks and a special condition for the last one:
public static IEnumerable<String> SplitByLength(String value,
int size, // you may want to set default for size, i.e. "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();
You don't need 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();
}
fiddle demo
I would go with Console.Write
instead:
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);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With