'String.Format 없이 문자열을 중앙에 정렬'에 해당되는 글 1건

  1. 2019.09.27 String.Format을 이용하지않은 중앙정렬

String.Format을 이용하지않은 중앙정렬

C#/Problems 2019. 9. 27. 11:45

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");
                }

: