[ 계기 ]
일부 쿠폰을 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의 자리 수에서 반올림이 가능하게 되었다.
- 이미 존재하는 라이브러리에 의존하지 말고 돌아가는 구조를 생각하여 만들면 쉽게 해결 할 수 있는 문제였다.
'Web' 카테고리의 다른 글
| [JavaScript] JSTL (0) | 2020.12.11 |
|---|---|
| Codemirror 기초 (0) | 2020.09.19 |