Console.WriteLine(String.Format("{0,42}", "길동"));
String.Format 메소드를 사용하면 입력하고자 하는 문자열("길동")의 길이를 .Length 를 이용해 자동 인식한다.
자동 인식한 문자열의 길이에서 총길이 (42)에서 문자열 길이만큼을 뺀 나머지를 공백으로 오른쪽을 채워넣는다.
여기서 문제는 자동인식할때 문자열이 한글일때도 한글자당 길이를 1로 인식한다.
자동으로 문자열 길이를 인식하므로 Encoding. Default. GetBytes(문자열) 이 문을 사용해 따로 문자열의 길이를 지정해줄 수가없다.
따라서 String.Format을 사용하지 않고 임의적으로 공간을 앞에 주는데 그 공간의 갯수는 총 길이 - 문자열바이트값 이다.
앞에 두는 빈공간을 뒤에도 똑같이 두게되면 문자는 중앙으로 오게된다.
총길이가 16칸인 칸에 앞뒤로 같은 빈공간을 두면서 문자를 정렬을 하기위한 식:
int bytelen = Encoding.Default.GetBytes(name[i]).Length;
int padlen = 8 - (bytelen / 2);
하지만 여기서 input 값이 영문일 경우, input의 byte길이 나누기 2를 하는 과정에서 소수가 발생할 수 가있다.
예를 들어 문자열이 영문 "a' 한글자 일때 2를 나누면 0.5가 된다.
여기서 padlen 의 타입은 int이기 때문에 0.5를 1로 반환한다.
1로 반환하게되면 반올림된 0.5의 값이 앞뒤로 두개가 되어 총 길이가 한칸이 늘어나는 현상이 생긴다
bytelen % 2 != 0 일때의 상황을 따로 만들어 뒤에 오는 빈공간이 한칸 줄게 만들어줬다.
if (bytelen % 2 != 0)
{
Console.WriteLine("{0}", "".PadLeft(padlen) + name[i] + "".PadRight(padlen-1) + "1");
}
else
{
Console.WriteLine("{0}", "".PadLeft(padlen) + name[i] + "".PadRight(padlen) + "1");
}