본문 바로가기
ABAP 문법 & 기법

[SAP ABAP] 가격 숫자 천 단위 콤마 표시 방법 — WRITE TO + SHIFT 패턴 (64148 → 64,148)

by Song.sh 2026. 5. 14.

SAP ABAP 에서 숫자를 사용자에게 보여주는 곳 — 메일 본문, 메시지 박스, 리포트 출력, CBO 화면 — 에서는 천 단위 콤마(64,148) 형식이 거의 필수입니다. 콤마 없이 64148 로 떠 있으면 단위가 만 단위인지 십만 단위인지 헷갈리고, 외부에 나갈 문서에서는 가독성이 크게 떨어집니다.

 

ABAP 자체는 콤마 포맷 함수를 한 줄로 제공하지는 않지만, WRITE TO 가 사용자 프로필 기준으로 자동 콤마 포맷팅을 수행 한다는 특성을 이용하면 깔끔하게 처리할 수 있습니다. 여기에 SHIFT 로 trailing 0·소수점·앞 공백을 정리하면 결과를 그대로 메일 본문에 꽂아 넣을 수 있는 문자열이 만들어집니다.

 

이 글은 NUMC·금액 필드를 메일·메시지용 천 단위 콤마 문자열 로 변환하는 패턴을 정리한 메모입니다.


핵심 원리

ABAP 의 WRITE ... TO ... 는 단순한 대입이 아니라 사용자 프로필의 천 단위 구분 문자 를 기준으로 포맷팅을 적용합니다. 대부분의 사용자는 콤마(,) 가 천 단위 구분자로 설정되어 있으니 그 값이 그대로 결과 문자열에 박혀 나옵니다.

단계 처리 결과
1 ALPHA = OUT 변환 앞쪽 0 제거 (예: 000006414864148)
2 PACKED 변수(p DECIMALS) 에 담기 숫자 타입으로 ABAP이 인식
3 WRITE TO CHAR 변수 자동으로 천 단위 콤마 적용 (64,148.00000000000000)
4 SHIFT 로 trailing 0·소수점·앞 공백 제거 최종 64,148 문자열

핵심 아이디어는 WRITE TO가 알아서 포맷팅 해주고, 우리는 남은 0과 점만 정리 하면 된다는 것입니다.


1단계 — 변수 선언

PACKED 변수와 CHAR 변수 두 개가 필요합니다. PACKED는 충분히 큰 자릿수와 소수점을 잡아주고, CHAR는 포맷팅 결과를 받을 충분한 길이로 잡습니다.

DATA: lv_value(16) TYPE p DECIMALS 14,
      lv_char(30).
  • lv_value — 16바이트 PACKED, 소수점 14자리. 큰 금액도 안전하게 담을 수 있는 폭
  • lv_char — 30자리 CHAR. 콤마·소수점·공백 모두 들어갈 여유 공간

너무 짧게 잡으면 WRITE TO 결과가 잘려서 출력이 깨지므로 넉넉히 잡는 게 안전합니다.


2단계 — ALPHA = OUT + 입력 검증

원본이 NUMC 또는 CHAR로 된 금액 필드라면 앞에 0이 채워져 있을 수 있습니다(0000064148). String template 의 ALPHA = OUT 으로 앞 0을 깔끔하게 제거.

" 원본 금액 문자열에서 앞 0 제거
DATA(lv_amount) = |{ ls_data-amount ALPHA = OUT }|.

" 숫자/소수점/공백만 들어있는지 검증
IF lv_amount CO '0123456789 .'.

  lv_value = lv_amount.       " PACKED 로 변환

  ...
ENDIF.

CO ('Contains Only') 체크가 핵심입니다. 사용자 입력이 섞여 들어오는 필드라면 문자나 특수기호가 끼어있을 수 있고, 그대로 PACKED 변환하면 덤프가 납니다. 숫자·소수점·공백만 들어있을 때만 처리하도록 가드를 둡니다.


3단계 — WRITE TO 로 포맷팅

PACKED 값을 CHAR 변수에 WRITE 하면 사용자 프로필 기준 천 단위 구분자가 자동 적용됩니다.

WRITE lv_value TO lv_char.
" 결과 예: '       64,148.00000000000000'
" (앞쪽 공백 + 콤마 적용 + 소수점 14자리)

이 시점에서 결과는 거의 다 됐지만 trailing 0과 소수점, leading 공백이 같이 들어있어 그대로 메일에 박으면 보기 흉합니다. 4단계에서 정리합니다.


4단계 — SHIFT 로 깔끔하게 정리

ABAP SHIFT 명령으로 trailing 0, 소수점, leading 공백을 차례로 제거.

" trailing 0 과 공백 제거 (오른쪽부터)
SHIFT lv_char RIGHT DELETING TRAILING '0 '.

" 남은 소수점 제거 (정수면 '64,148.' 형태가 됨 → 점 제거)
SHIFT lv_char RIGHT DELETING TRAILING '.'.

" leading 공백 제거 (왼쪽 정렬)
SHIFT lv_char LEFT DELETING LEADING space.

" 결과를 원래 변수로 복원
MOVE lv_char TO lv_amount.
" 최종 결과: '64,148'
SHIFT 명령 제거 대상
SHIFT ... RIGHT DELETING TRAILING '0 ' 오른쪽 끝의 0 과 공백
SHIFT ... RIGHT DELETING TRAILING '.' 오른쪽 끝의 소수점
SHIFT ... LEFT DELETING LEADING space 왼쪽 끝의 공백 (왼쪽 정렬)

3번의 SHIFT가 한 세트입니다. 순서가 중요 — 0/공백 → . → 앞 공백 순으로 처리해야 정수도 소수도 깔끔하게 떨어집니다.


활용 예시 — 메일/메시지에 삽입

만들어진 콤마 문자열은 그대로 메일 본문, 메시지, 리포트 출력에 활용할 수 있습니다.

" 메일 본문 구성 예시
DATA: lv_mail_body TYPE string.

lv_mail_body = |안전관리비는 { lv_amount }원 입니다.|.

" 결과: "안전관리비는 64,148원 입니다."

string template (|...|) 안에 그대로 끼워 넣으면 그대로 표시됩니다. 단위가 만 단위인지 천 단위인지 사용자가 한눈에 알아볼 수 있어 메일 받는 쪽 가독성이 크게 올라갑니다.


흔히 빠뜨리는 함정

CHAR 변수 길이 부족

lv_char 를 너무 짧게(예: 10자리) 잡으면 큰 금액에서 콤마+소수점까지 들어갈 자리가 모자라 결과가 잘립니다. 최소 30자리 이상 권장.

ALPHA = OUT 누락

NUMC/CHAR 원본에 앞 0이 있는 채로 PACKED에 넣으면 ABAP이 0을 의미 있는 자리수로 해석해서 결과 자리수가 어긋날 수 있음. 앞 0은 반드시 ALPHA = OUT 으로 제거 후 처리.

CO 검증 없이 PACKED 변환

원본에 문자(예: 'N/A', '미정') 가 들어 있는데 lv_value = lv_amount 시도하면 즉시 덤프(BCD_FIELD_OVERFLOW 또는 CONVT_NO_NUMBER). CO '0123456789 .' 검증 필수.

소수점이 있는 금액인데 trailing 0 모두 제거

소수점 있는 금액(예: 123.45) 까지 처리할 때는 SHIFT ... DELETING TRAILING '0 ' 가 의미 있는 0(예: 123.40 → 123.4) 까지 잘라낼 수 있음. 소수점 자리 보존이 필요하면 FORMAT 또는 WRITE ... DECIMALS n 사용.

사용자 프로필 천 단위 구분자가 다른 경우

ABAP은 SU3(사용자 프로필) 의 "Decimal Notation" 설정을 따라 콤마/마침표를 다르게 적용합니다. 한국 환경은 보통 1,234,567.89 이지만 유럽은 1.234.567,89 형식. 외부 발송 메일이라면 의도한 형식이 나오는지 확인. 강제로 콤마 사용이 필요하면 SET COUNTRY 'US' 같은 옵션 사용 가능.

단순 ALV 출력에서는 자동 포맷 사용 권장

ALV 출력 시에는 cfieldname(통화 필드 참조) 또는 do_sum/필드 카탈로그 decimals_o 로 자동 처리가 더 깔끔. 이 글 패턴은 이메일·메시지·CBO 화면 표시 같은 문자열 출력 용도에서 의미가 큽니다.


요약

단계 처리 예시 값 변화
1 p DECIMALS 14 + CHAR(30) 변수 선언 버퍼 준비
2 ALPHA = OUT + CO '0123456789 .' 검증 000006414864148
3 WRITE lv_value TO lv_char 64,148.00000000000000
4 SHIFT 3회 (trailing 0+공백 → trailing . → leading space) 64,148
5 string template 에 삽입 "안전관리비는 64,148원 입니다."

ABAP은 콤마 포맷 함수 한 줄이 따로 없지만, WRITE TO 의 자동 포맷팅 + SHIFT 클린업 조합으로 충분히 깔끔하게 처리됩니다. 이 패턴 한 번 익혀두면 메일·메시지·리포트 어디서든 같은 코드를 그대로 재사용할 수 있고, 사용자가 받는 결과의 가독성이 크게 좋아져서 들이는 노력 대비 효과가 좋은 작은 기법입니다.


Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다. SAP 버전·사용자 프로필 설정(SU3)·로케일 환경에 따라 천 단위 구분자가 다르게 적용될 수 있으므로 운영 환경 적용 전 개발 시스템에서 결과 문자열을 확인하시기 바랍니다.