Lua 문자열 포맷팅 이해하기 -: string.format 활용법

개발/lua script1 2026. 1. 2. 08:03

 

1) string.format이 뭐고, 언제 쓰나

string.format문자열 안에 변수 값을 보기 좋게 끼워 넣는 함수입니다.

특히 아래 같은 상황에서 자주 씁니다.

 

  • 로그 메시지(디버깅 로그) 포맷 통일
  • 숫자 자리수/소수점/천단위 표시 같은 출력 정리
  • 날짜/시간 같은 고정 형식 문자열 만들기
  • 파일명, 키 값, ID 같은 규칙 문자열 생성

 

기본 형태는 아래처럼 씁니다.

local s = string.format("name=%s, age=%d", "Tom", 20)
print(s)  -- name=Tom, age=20

 


 

2) 가장 많이 쓰는 포맷 지정자 정리

string.format("...%지정자...", 값) 형태에서 %지정자가 핵심입니다.

 

문자열/숫자 기본

  • %s : 문자열
  • %d : 정수(10진수)
  • %f : 실수(기본 소수 6자리)
  • %% : 퍼센트 문자 자체 출력
print(string.format("user=%s", "kim"))
print(string.format("count=%d", 15))
print(string.format("ratio=%f", 0.25))
print(string.format("progress=50%%"))  -- % 출력

 


3) 자릿수, 정렬, 채우기(패딩)

형식은 보통 이런 느낌입니다.

  • %10s : 전체 폭 10칸, 오른쪽 정렬
  • %-10s : 전체 폭 10칸, 왼쪽 정렬
  • %05d : 폭 5칸, 빈칸을 0으로 채움
print(string.format("|%10s|", "Lua"))   -- |       Lua|
print(string.format("|%-10s|", "Lua"))  -- |Lua       |
print(string.format("%05d", 42))        -- 00042

실무에서는 “표처럼 보이게” 로그를 맞출 때 이런 패턴이 꽤 유용합니다.

 


 

4) 소수점 자리 제어(반올림 포함)

%.2f처럼 점(.) 뒤에 자릿수를 붙이면 됩니다.

print(string.format("%.2f", 3.14159))  -- 3.14
print(string.format("%.0f", 3.9))      -- 4
print(string.format("%.3f", 1.2))      -- 1.200

금액/비율 출력할 때 거의 고정으로 쓰입니다.

 


 

5) 16진수/8진수 출력 (디버깅에 자주 씀)

  • %x : 16진수(소문자)
  • %X : 16진수(대문자)
  • %o : 8진수
local v = 255
print(string.format("0x%x", v))  -- 0xff
print(string.format("0x%X", v))  -- 0xFF
print(string.format("%o", v))    -- 377

바이트/플래그/마스크 같은 값 볼 때 특히 편합니다.

 


6) 날짜/시간 문자열 만들기 조합 예시

Lua 자체 시간 포맷은 os.date가 담당하지만, string.format이 같이 쓰이면 결과가 깔끔해집니다.

local y, m, d = 2026, 1, 2
print(string.format("%04d-%02d-%02d", y, m, d)) -- 2026-01-02

%02d 같은 패딩이 핵심입니다. 날짜/시간은 1자리일 때도 2자리로 맞추는 게 보통이라서요.

 


 

7) 로그 포맷 예시 (현업에서 가장 많이 쓰는 형태)

local tag = "NET"
local code = 200
local msg = "OK"

print(string.format("[%s] code=%d msg=%s", tag, code, msg))
-- [NET] code=200 msg=OK

 

조금 더 고급으로, 폭을 맞춰서 “보기 좋게” 만드는 패턴도 있습니다.

local tag, code, ms = "HTTP", 404, 12.3456
print(string.format("[%-5s] code=%3d time=%6.2fms", tag, code, ms))
-- [HTTP ] code=404 time= 12.35ms

 


 

8) 실수/정수 타입 주의점 (자주 나는 실수)

%d는 정수용입니다. 실수를 넣으면 환경에 따라 에러 또는 예상치 못한 출력이 날 수 있습니다.

반대로 %f에 정수를 넣는 건 보통 문제 없지만, 소수점이 붙습니다.

print(string.format("%d", 3.9))   -- 환경에 따라 문제 가능
print(string.format("%.0f", 3.9)) -- 안전하게 반올림 정수처럼 출력

 


9) string.format 대신 문자열 연결( .. )을 쓰면 안 되나?

간단한 경우는 ..도 충분합니다.

local s = "id=" .. 10 .. ", name=" .. "kim"

 

다만 값이 많아지거나 포맷이 규칙적이면 string.format이 더 깔끔합니다.

  • 포맷 규칙이 한 줄에 모여 있어서 수정이 쉽고
  • 자리수/정렬/반올림 같은 출력 품질을 통일하기 좋고
  • 로그가 일정한 형태로 유지됩니다

 


 

10) 자주 쓰는 템플릿 모음

금액(소수점 2자리)

local price = 1234.567
print(string.format("price=%.2f", price)) -- 1234.57

 

ID 8자리 0패딩

local id = 345
print(string.format("ID=%08d", id)) -- ID=00000345

 

파일명 규칙

local userId, seq = 12, 3
local filename = string.format("user_%04d_%03d.log", userId, seq)
print(filename) -- user_0012_003.log
반응형
admin