본문 바로가기
Web

[JSTL] 정수 반올림

by wave_m 2021. 5. 10.
728x90

[ 계기 ]

일부 쿠폰을 vat을 포함해서 front에 뿌려야하는데

back-end에서가 아닌 front-end에서의 정수 반올림을 구현해야했다.

찾아보니 jstl을 활용한 소수점 반올림만 있고 정수 반올림은 잘 없고

있는 코드로 나에게는 오류가 계속 나서 새로 만들었다. (순수 jstl)

혹시 나중에 또 쓸 수도 있으니까 내가 올린다.

 

 

[ Server에서 받는 값 ]

couponName : 쿠폰 이름

remainPrice : 남은 금액

 

 

[ 전제 ]

1. vat을 포함한 쿠폰 금액과 vat을 포함하지 않은 쿠폰을 DB에 입력

2. front에는 vat을 포함한 금액을 표현(vat을 포함한 쿠폰 금액은 제외)

3. vat은 10%로 적용

 

 

[ 코드 ]

<c:forEach var="item" items="${couponList }">
<c:choose>
    <c:when test="${item.couponName eq 'coupon A' or
    	item.couponName eq 'coupon B' or
        item.couponName eq 'coupon C'}">
	<dd><fmt:formatNumber value="${item.remainPrice}" pattern="#,###"/></dd>
</c:when>
<c:otherwise>
	<fmt:parseNumber var= "resultPrice" integerOnly= "true" value= "${(item.remainPrice * 1.1)/10}" type="number"/>
	<c:choose>
		<c:when test="${resultPrice % 10 ge 5}">
			<dd><fmt:formatNumber value="${resultPrice * 10 + 10}" pattern="#,###"/></dd>
		</c:when>
        <c:otherwise>
		<dd><fmt:formatNumber value="${resultPrice* 10}" pattern="#,###"/></dd>
        </c:otherwise>
	</c:choose>		
</c:otherwise>
</c:choose>
</c:forEach>

※ 들여쓰기는 추후 수정 예정

 

 

[ 코드 해석 ]

 

1. vat을 포함하여 입력한 coupon A, coupon B, coupon C은 입력된 값 그냥 가져옴
2. vat을 포함하지 않은 coupon 들은 10의 자리 수에 대한 연산을 해줘야 함
3. 입력된 값에 1.1을 곱해줌(vat 10%를 적용)
4. 3에 해당 하는 값에 10을 나눠줌

=> 예를 들어 입력된 값이 181818이면 vat을 적용하면 199999.8이 됨

     199999.8에 10을 나눠주면 몫이 나옴

     몫 중에서도 정수 부분만 가져올 거기 때문에 formatNumber에 integerOnly를 사용하여 resultPrice에 대입

5-1. resultPrice를 10으로 나누었을 때 나머지가 5 이상이면 resultPrice에 10을 곱하고 10을 더해줌

=> 19999는 10으로 나누었을 때 나머지가 9이니 resultPrice에 10을 곱하면 199990, 10을 더해주면 200000이 됨

5-2. resultPrice를 10으로 나누었을 때 나머지가 5 이하이면 resultPrice에 10을 곱함

 

 

[ 결과 ]

- 원하는 1의 자리 수에서 반올림이 가능하게 되었다.

- 이미 존재하는 라이브러리에 의존하지 말고 돌아가는 구조를 생각하여 만들면 쉽게 해결 할 수 있는 문제였다.

 

 

 

728x90

'Web' 카테고리의 다른 글

[JavaScript] JSTL  (0) 2020.12.11
Codemirror 기초  (0) 2020.09.19