본문 바로가기
DB활용

[오라클 함수활용] TO_CHAR로 백분률 변환하기

by 황금웃음만두 2020. 1. 8.

백분률을 관리하는 데이터를 출력을 위해 TO_CHAR변환 함수를 사용하는 경우를 설명하고자 합니다

 

백분률은 숫자형 데이터형이며 고객의 요구에 따라 TO_CHAR로 화면에 출력해주는 경우가 있습니다

 

 

고객의 요구가 다음과 같을 경우 처리하는 방법에 대해서 설명하고자 합니다

 

백분률 처리시

소숫점자리 처리 : 소숫점 둘째자리까지 출력(반올림없이 버림), 출력값이 없을경우 0으로 채움, 

정수자리 : 십의자리가 없을 경우 0으로 채움

 예) 값 : 1 , 출력값 : 01.00

      값 : 100, 출력값 : 100.00

      값 : 50.2474 , 출력값 : 50.24

 

      

 

우선 아래 형태로 샘플데이터를 만듭니다

SELECT RNUM
       ,PER

FROM ( SELECT 1 RNUM, 1 PER  FROM DUAL
       UNION ALL
       SELECT 2 RNUM, 100 PER  FROM DUAL
       UNION ALL
       SELECT 3 RNUM, 50.2474 PER  FROM DUAL
      ) SAMPLE

 

 

TO_CHAR의 포멧 스트링 '9'와 '.'콤마 을 통해 처리하도록 합니다

 

SELECT RNUM
       ,PER
       ,TO_CHAR(PER,'FM999.99') FORMAT1
FROM ( SELECT 1 RNUM, 1 PER  FROM DUAL
       UNION ALL
       SELECT 2 RNUM, 100 PER  FROM DUAL
       UNION ALL
       SELECT 3 RNUM, 50.2474 PER  FROM DUAL
      ) SAMPLE

 

위 쿼리를 조회하면 다음과 같은 결과가 나옵니다

RNUM PER FORMAT1
1 1 1.
2 100 100.
3 50.2474 50.25

 

고객의 요청에 의한 십의자리수 0으로 채우고 , 소숫점 자리수 두자리 0으로 채우는것이 충족되지가 않습니다

 

 

다음과 같이 포멧스트링에 9대신 0으로 채워봅니다

 

SELECT RNUM
       ,PER
       ,TO_CHAR(PER,'FM999.99') FORMAT1
       ,TO_CHAR(PER,'FM000.00') FORMAT2
FROM ( SELECT 1 RNUM, 1 PER  FROM DUAL
       UNION ALL
       SELECT 2 RNUM, 100 PER  FROM DUAL
       UNION ALL
       SELECT 3 RNUM, 50.2474 PER  FROM DUAL
      ) SAMPLE

 

 

RNUM PER FORMAT1 FORMAT2
1 1 1. 001.00
2 100 100. 100.00
3 50.2474 50.25 050.25

0을 정수 3째자리까지 채우니 3째자리까지 0으로 채우는것이 고정되며 3번행의, 50.2474의 소숫점 2째자리가 반올림되어 산출되어있는 문제가 있어 다음과 같이 변경합니다

 


SELECT RNUM
       ,PER
       ,TO_CHAR(PER,'FM999.99') FORMAT1
       ,TO_CHAR(PER,'FM000.00') FORMAT2
       ,TO_CHAR(PER,'FM900.00') FORMAT3
FROM ( SELECT 1 RNUM, 1 PER  FROM DUAL
       UNION ALL
       SELECT 2 RNUM, 100 PER  FROM DUAL
       UNION ALL
       SELECT 3 RNUM, TRUNC(50.2474,2) PER  FROM DUAL
      ) SAMPLE
      

 

RNUM PER FORMAT1 FORMAT2 FORMAT3
1 1 1. 001.00 01.00
2 100 100. 100.00 100.00
3 50.2474 50.25 050.25 50.24

3번째 포멧에 와서야 제대로 표현되는것 같습니다

 

필수적으로 자리수를 보전하고 싶을 때는 포멧스트링을 '0'으로 기재하고

 

있거나 없거나 한 숫자를 표현할때는 '9'로 표현한다는것을 알 수 있습니다

 

기본적으로 TO_CHAR에서 소숫점 반올림 처리가 되므로 버림처리를 하셔야 할 경우 원본 칼럼에서 TRUNC 함수로 필요한 자리수를 기재하여 TO_CHAR 변환하셔야됩니다

 

 

 

그런데 포멧스트링에 왜 FM을 붙이는지 의문이 있으신 분들은 아래 SQL을 돌려 결과를 보시면 

 

FM은 포멧스트링의 공백을 없애는 접두어라는것을 확인하실 수 있습니다

 

SELECT RNUM
      ,PER
      ,REPLACE(FORMAT1,' ','@') FORMAT1_REPL 
      ,REPLACE(FORMAT2,' ','@') FORMAT2_REPL 
FROM(

SELECT RNUM
       ,PER
       ,TO_CHAR(PER,'900.00') FORMAT1
       ,TO_CHAR(PER,'FM900.00') FORMAT2
FROM ( SELECT 1 RNUM, 1 PER  FROM DUAL
       UNION ALL
       SELECT 2 RNUM, 100 PER  FROM DUAL
       UNION ALL
       SELECT 3 RNUM, TRUNC(50.2474,2) PER  FROM DUAL
      ) SAMPLE
)      

 TO_CHAR로 변환한 데이터의 공백을 '@'로 치환하는 내용인데요

 

FM이 없는 FORMAT1 FORMAT1_REPL에 공백이 2개씩 들어가 있는것을 볼 수 있습니다

 

포멧부여시 들어가는 공백을 'FM'접두어가 없으면 프로그램으로 전달 시 공백까지 같이 전달되므로

 

반드시 'FM' 접두어를 붙여주시길 바랍니다

 

RNUM PER FORMAT1_REPL FROMAT2_REPL
1 1 @@1.00 01.00
2 100 @@100.00 100.00
3 50.2474 @@50.24 50.24

 

 

이상 백분률을 TO_CHAR로 전환하는 포스팅을 마칩니다

 

 

댓글