Menu

PHP sprintf(): 문자열 포맷, 0 채우기, 소수점

sprintf()는 포맷과 값으로 문자열을 만듭니다: sprintf('%05.2f', 3.14159)는 "03.14"를 반환합니다. %s, %d, %f, 0 채우기, 고정 소수점, 정렬, 인수 번호, printf와 vsprintf를 알아봅니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

sprintf()는 포맷과 값 목록으로 만든 문자열을 반환합니다. 포맷의 각 % 자리 표시자가 다음 값으로 바뀝니다. sprintf('%s is %d years old', 'Ada', 36)는 "Ada is 36 years old"를 반환합니다. printf()는 같은 인수를 받지만 결과를 반환하는 대신 출력합니다.

자리 표시자는 왼쪽에서 오른쪽으로 차례로 채워집니다. %.2f는 항상 소수점 두 자리를 보여 주고(4.5가 아니라 4.50), %05d는 숫자를 0으로 채워 다섯 자리로 만듭니다.

포맷 지정자

자리 표시자는 %, 선택적인 수식어, 그리고 타입을 나타내는 문자 하나로 이루어집니다.

지정자의미sprintf(...)결과
%s문자열sprintf('%s', 'PHP')PHP
%d정수(부호 있음)sprintf('%d', 42.9)42
%f실수, 기본 소수점 6자리sprintf('%f', 1.5)1.500000
%.2f실수, 소수점 2자리sprintf('%.2f', 1.5)1.50
%e과학적 표기법sprintf('%e', 1234.5678)1.234568e+3
%x / %X16진수sprintf('%x', 255)ff
%o8진수sprintf('%o', 8)10
%b2진수sprintf('%b', 5)101
%c코드에 해당하는 문자sprintf('%c', 65)A
%u부호 없는 정수sprintf('%u', 3)3
%%퍼센트 기호 그대로sprintf('%d%%', 50)50%

아래 값을 바꾸고 다시 실행해 보세요.

%d는 실수를 0 쪽으로 버리므로 42.9는 42가 됩니다. 43을 원한다면 먼저 반올림하세요: sprintf('%d', round(42.9)). 'abc'처럼 숫자가 아닌 문자열은 %d에서 0이 됩니다.

앞자리를 0으로 채우기

%와 문자 사이에 채울 문자와 폭을 넣을 수 있습니다. %05d는 "0으로 채워 폭 5로"를 뜻합니다. 주문 번호, 송장 ID, 시간, 날짜를 포맷하는 일반적인 방법입니다.

폭은 최솟값입니다. 폭보다 긴 숫자는 전부 출력됩니다.

%05.2f: 폭과 소수점을 함께

실수에서 폭은 소수점과 마이너스 기호를 포함한 결과의 모든 문자를 셉니다. 그래서 3.14159에 %05.2f를 쓰면 03.14가 됩니다. 전체 다섯 글자이고 그중 두 자리가 소수점 뒤입니다.

%f는 setlocale()로 설정한 현재 로케일의 소수점 기호를 쓰고, %F는 항상 점을 씁니다. 코드에서 로케일을 설정하는데 JSON, CSV, API용으로 점이 필요하다면 %F를 쓰세요.

텍스트를 열에 맞춰 정렬하기

양수 폭은 오른쪽 정렬, 폭 앞의 -는 왼쪽 정렬이며, ' 뒤에 문자를 쓰면 채울 문자를 직접 정합니다. 이를 조합하면 일반 텍스트 보고서와 영수증을 정렬할 수 있습니다.

%-14s는 상품명을 오른쪽에 채워 14자로 만들고, %8.2f는 가격을 8자 안에 오른쪽 정렬하며, 빈 문자열과 함께 쓴 %'-27s는 대시 27개로 된 선을 출력합니다. %'*10s는 공백 대신 *로 채웁니다.

인수에 번호를 붙여 재사용하거나 순서 바꾸기

%1$s는 "첫 번째 인수를 문자열로", %2$d는 "두 번째 인수를 정수로"를 뜻합니다. 번호를 붙인 자리 표시자를 쓰면 인수 목록을 바꾸지 않고도 값을 두 번 쓰거나 순서를 바꿀 수 있으며, 언어마다 어순이 다를 때 번역자에게 필요합니다.

vsprintf, printf와 반환값

vsprintf()는 값을 배열 하나로 받으므로 값이 이미 배열에 있을 때 편리합니다. printf()는 출력한 바이트 수를 반환하고, vprintf()는 printf()의 배열 버전입니다.

printf()의 개수에는 줄바꿈이 포함되므로 "Hello\n"은 6바이트입니다. 멀티바이트 텍스트에서는 문자가 아니라 바이트를 셉니다.

인수가 부족하면 에러

PHP 8부터는 값보다 자리 표시자가 많은 포맷이 false를 반환하는 대신 ArgumentCountError를 던집니다. 이 에러를 보면 % 자리 표시자의 개수를 세어 보세요(%%는 제외).

메시지는 포맷 문자열도 인수로 셉니다: ArgumentCountError: 4 arguments are required, 3 given. 남는 인수는 조용히 무시되므로 반대 실수는 에러로 드러나지 않습니다. sprintf 결과가 이상해 보이면 포맷과 값을 나란히 출력해 보세요. 천 단위 구분 기호만 필요하다면 sprintf로 만드는 것보다 number_format()이 더 간단합니다. 전체 수식어 목록은 php.net에 있습니다.

자주 묻는 질문

PHP에서 숫자 앞에 0을 채우려면 어떻게 하나요?

sprintf('%05d', 42)를 쓰면 "00042"를 반환합니다. 0은 채울 문자이고 5는 전체 폭입니다. 문자열이라면 str_pad('42', 5, '0', STR_PAD_LEFT)가 같은 결과를 줍니다.

sprintf로 숫자를 소수점 2자리로 포맷하려면 어떻게 하나요?

%.2f를 쓰세요: sprintf('%.2f', 3.14159)는 "3.14"를, sprintf('%.2f', 5)는 "5.00"을 반환합니다. 폭을 추가해 채울 수도 있습니다: %08.2f는 "00003.14"를 줍니다.

PHP에서 printf와 sprintf의 차이는 무엇인가요?

sprintf()는 포맷한 문자열을 반환하므로 저장할 수 있습니다. printf()는 바로 출력하고 출력한 바이트 수를 반환합니다. echo sprintf(...)와 printf(...)는 같은 출력을 냅니다.

PHP에서 %s는 무엇을 뜻하나요?

%s는 sprintf()와 printf()에서 문자열 자리 표시자입니다: sprintf('Hello, %s', 'Ada')는 "Hello, Ada"를 반환합니다. %s에 넘긴 숫자는 문자열로 바뀝니다. %d는 정수, %f는 실수용입니다.

sprintf에서 같은 인수를 두 번 쓰려면 어떻게 하나요?

자리 표시자에 번호를 붙이세요: sprintf('%1$s loves %2$s, and %2$s loves %1$s', 'Ada', 'PHP'). 포맷은 작은따옴표로 감싸세요. 큰따옴표 안에서는 PHP가 $s를 변수로 읽으므로 "%1$s"는 %1 뒤에 $s의 값이 붙은 것이 됩니다.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기