반응형

 leading zero, leading space 이런 문제들은 string을 다루다 보면 한 번 정도는 보실 문제들입니다. 10개의 width에 string 값을 오른쪽 정렬을 하고 남은 공간들은 space로 채운다고 했을 때, 이렇게 코딩했었습니다. 예를 들어 string이 길이가 10 이하라고 해 보겠습니다.

 

 

 cho를 오른쪽 정렬하면 "       cho"가 되고, 왼쪽으로 정렬하면 "cho       "가 됩니다. 이걸 저는 padding 길이를 구하고 그 길이만큼 padding이 되는 문자열을 만든 다음에 왼쪽, 혹은 오른쪽에 붙이는 식으로 하였습니다. repeated는 캐릭터 하나와 얼마만큼 반복할 것인지를 나타내는데요.

 

 

 내부에는 그냥 StringBuilder 등으로 이어 붙여버립니다.

 

 

 결과는 요래 잘 나옵니다.

 


 그런데, 자바는  format 이라는 매우 편리한 녀석을 제공합니다. 이 메서드를 이용하면, leading, trailing zero 등을 손쉽게 처리할 수 있는데요. format string 부분을 쭉 읽다 보시면 아래와 같은 구문이 나옵니다.

 

 

 %[argument_index$][flags][width][.precision]conversion 이 부분이요. 여기서 argument_index 부분만 빼고 보면, 뭔가 익숙한 냄새가 나실 거에요. 아직 눈치를 채지 못하셨나요? c언어에서 printf문을 배우셨다면, %5s, %-3s 이런 건 많이 보셨을 거에요. 예를 들어 %10s는 문서에 따르면 프린트가 되어야 하는 최소 문자 수가 10임을 의미해요. flag는 따로 안 붙어있으므로 우측 정렬일 테고요. 타겟 string의 길이가 더 작다면 남은 부분은 blank로 채워지게 됩니다.

 

 

 예를 들어 이 프로그램은 공백이 7번 출력된 다음에 "abc"가 출력되겠네요.

 

 

 실행 결과는 저래 나와요. java의 format 문자열에 대한 설명을 쭉 읽다 보면, width에 대한 설명 중에 비슷한 부분이 있는데요.

 

 

 여기도 똑같이 minimum number of characters 라고 되어 있어요. 그래서 %10s와 같이 써 주면, string을 위한 최소 출력 문자수가 10이라는 이야기가 됩니다.

 

 

 다음에 flag 부분을 보면 -가 있는데요. 이는 왼쪽 정렬을 의미해요. 예를 들자면, String.format("%-10s", "abc")의 수행 결과는 문자열 "abc"가 먼저 나오고 공백 7개가 연달아서 나오게 됩니다. 이제 아래 예제를 봅시다.

 

 

 출력 결과가 어떻게 나올까요? %10s %10s는 flag가 붙지 않았으니, "        55         33"이 나올 겁니다. 반면에 %-10s %-10s는 앞에 -가 붙었으니 "55         33        "이 나올 거에요. 별로 어렵지 않네요.

 

 제가 예상했던 대로 나왔음을 알 수 있어요. 그러면 leading zero 처리와 trailing zero 처리는 어떻게 하면 좋을까요? string으로 받아버리면 되긴 하는데, 이건 trailing의 경우고요. leading의 경우는 사실 더 쉬운 처리 방법이 있습니다.

 

 

 먼저 flag에 0을 붙이면 0으로 padding이 됩니다.

 

 

 그리고 Numeric field에는 Integral이 있는데요. java의 정수 타입에 반영될 거다. 이런 설명이 있어요. 보니까 byte, short, int, long, BigInteger에 반영된다고 되어 있어요. 그리고 밑에 쭉 읽어 보니까 아래와 같은 내용이 있어요.

 

 

 'd'를 붙이면 decimal integer로 뿌려준다. 즉, %010d는 width가 10이고 integer 값을 오른쪽 정렬해 주는데, 나머지 공간을 0으로 채워버린다는 뜻이 됩니다. 그래서, String.format("%020d",123451234512345L)의 결과는 "00000123451234512345"가 됩니다. 이건 어렵지 않게 할 수 있어요. flag 0이 0을 채운다라는 의미이고, -가 붙어 있지 않으면 우측 정렬일 테고, width는 20일 거니까요.

 

 그런데, trailing zero를 붙이는 경우에는 좀 까다로운데요. 이 경우에는 약간의 생각을 하셔야 됩니다. 일단, large를 string으로 취급한다면, 그 다음에 flag를 -로 줄 수 있어요. 그러면 "123451234512345     "가 될 겁니다. 이제, 공백을 '0'으로 치환해 버리면 됩니다.

 

 

 이 일련의 과정을 위와 같이 할 수 있어요. 4번째 줄은 leading zero를 붙인 것이고요. 5 ~ 6번째 줄은 trailing zero를 붙인 거에요. 결과를 볼까요?

 

 

 잘 나왔음을 알 수 있어요. replace 메서드를 이용하면 개꿀이라는 것도 알 수 있었습니다.

반응형

댓글을 달아 주세요