format 함수

format 함수

format은 명세(specification) 문자열에 따라 여러 다른 값들을 포맷해서 문자열을 만들어내요. C의 printf 함수나 다른 프로그래밍 언어의 비슷한 함수와 유사해요.

출처: Packer 공식 문서

본문

format(spec, values...)

예시 (Examples)

> format("Hello, %s!", "Ander")
Hello, Ander!
> format("There are %d lights", 4)
There are 4 lights

%s나 %d 같은 단순한 포맷 동사들은 템플릿 보간 구문과 비슷하게 동작해요. 오히려 템플릿 보간이 더 읽기 쉬운 경우가 많죠:

> format("Hello, %s!", var.name)
Hello, Valentina!
> "Hello, ${var.name}!"
Hello, Valentina!

그래서 format 함수는 아래 절에서 설명하는 더 복잡한 포맷 명세를 쓸 때 더 유용해요.

명세 문법 (Specification Syntax)

명세는 % 문자로 시작하는 포맷 동사를 포함한 문자열이에요. 함수 호출은 명세의 각 동사 시퀀스에 대해 인자 하나씩을 추가로 가져야 해요. 동사는 주어진 각 인자가 포맷 동사가 요구하는 타입으로 변환될 수 있는 한, 연속된 인자와 짝을 지어 지시된 대로 포맷돼요.

명세에는 다음 동사들이 포함될 수 있어요:

Verb Result
%% 값을 소비하지 않는 리터럴 퍼센트 기호.
%v 아래 설명처럼 값 타입에 따른 기본 포맷.
%#v jsonencode처럼 값의 JSON 직렬화.
%t 불리언으로 변환해 true 또는 false를 만든다.
%b 정수로 변환해 이진 표현을 만든다.
%d 정수로 변환해 십진 표현을 만든다.
%o 정수로 변환해 팔진 표현을 만든다.
%x 정수로 변환해 소문자 16진 표현을 만든다.
%X %x와 같지만 대문자를 사용한다.
%e 숫자로 변환해 -1.234456e+78 같은 과학 표기법을 만든다.
%E %e와 같지만 지수를 도입할 때 대문자 E를 사용한다.
%f 숫자로 변환해 지수 없는 123.456 같은 십진 분수 표기법을 만든다.
%g 큰 지수에서는 %e처럼, 그 외에는 %f처럼 동작한다.
%G 큰 지수에서는 %E처럼, 그 외에는 %f처럼 동작한다.
%s 문자열로 변환해 문자열의 문자들을 넣는다.
%q 문자열로 변환해 JSON 따옴표로 감싼 문자열 표현을 만든다.

%v를 쓸 때는 값 타입에 따라 다음 포맷 동사 중 하나가 선택돼요:

Type Verb
string %s
number %g
bool %t
any other %#v

Null 값은 %v나 %#v로 포맷하면 문자열 null을 만들고, 다른 동사에서는 오류를 일으켜요.

너비 수정자는 동사 문자 바로 앞에 오는 선택적인 십진수로 포함시킬 수 있고, 값 표현에 사용할 문자 수를 지정해요. 정밀도는 (선택적인) 너비 뒤에 마침표(.) 다음 십진수로 지정할 수 있어요. 너비나 정밀도를 생략하면 주어진 값에 따라 기본값이 선택돼요. 예를 들면:

Sequence Result
%f 기본 너비와 정밀도.
%9f 너비 9, 기본 정밀도.
%.2f 기본 너비, 정밀도 2.
%9.2f 너비 9, 정밀도 2.

% 기호 바로 뒤에는 추가 플래그를 설정하는 다음 기호들을 사용할 수 있어요:

Symbol Result
space 숫자가 양수일 때 부호가 있어야 할 자리에 공백을 남긴다.
+ 양수여도 숫자의 부호를 보여준다.
- 오른쪽이 아니라 왼쪽에 공백으로 너비를 채운다.
0 공백이 아니라 앞자리 0으로 너비를 채운다.

기본적으로 % 시퀀스는 첫 번째부터 시작해 연속된 인자를 소비해요. 동사 문자 바로 앞에 [n] 시퀀스(여기서 n은 십진 정수)를 넣으면, 1부터 시작하는 인덱스로 특정 값 인자를 명시적으로 선택해요. 이후 명시적 인덱스가 없는 호출은 n+1, n+2 등으로 진행돼요.

포맷 문자열이 불가능한 변환을 요청하거나 주어진 인자보다 많은 인자에 접근하면 함수는 오류를 만들어요. 지원되지 않는 포맷 동사에 대해서도 오류가 생겨요.

  • formatdate는 사람이 읽을 수 있는 타임스탬프를 위한 특화된 포맷 함수예요.
  • formatlist는 같은 명세 문법으로 문자열 리스트를 만들어요.