JSTL数字格式化:
引入架包 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<fmt:formatNumber value="${2.6}" type="number" pattern="#"/> //返回结果是:3
<fmt:formatNumber value="${2.1}" type="number" pattern="#"/> //返回结果是:2
从上可知JSTL的数字格式化会对数字进行四舍五入,如果想要实现:上面代码都返回2或者都返回1,也就是向上、向下取整。就需要额外处理,因为JSTL没有JS中的Math.ceil() 和Math.floor()方法,使用以下方法:
//实现向上取整
<fmt:formatNumber value="${2.6 + (2.6 % 1 == 0 ? 0 : 0.5)}" type="number" pattern="#" /> //结果为:3
<fmt:formatNumber value="${2.1 + (2.1 % 1 == 0 ? 0 : 0.5)}" type="number" pattern="#" /> //结果为:3
//实现向下取整
<fmt:formatNumber value="${2.6 + (2.6 % 1 == 0 ? 0 : -0.5)}" type="number" pattern="#" /> //结果为:2
<fmt:formatNumber value="${2.1 + (2.1 % 1 == 0 ? 0 : -0.5)}" type="number" pattern="#" /> //结果为:2
案例:
现在用户A在参加一个活动,该活动有结束日期,A可以查看现在距离活动结束还有多少天。实现如下:
//截止日期为${endDate}
<jsp:useBean id="now" class="java.util.Date" /> //获取当前时间
<c:set var="timeMis" value="${data.loanLimitedEndTime.time - now.time}"></c:set>
<fmt:formatNumber var="leftDays" value="${timeMis/1000/3600/24+1}" pattern="#"/>
使用以上方法计算,就会发现有时候计算的结果刚好正确,有时候计算的结果多一天。排查原因:数字格式化时,进行了四舍五入。而对于实际情况应该是向下取整,不应该执行四舍五入,使用上面讲到的方法修复如下:
//截止日期为${endDate}
<jsp:useBean id="now" class="java.util.Date" /> //获取当前时间
<c:set var="timeMis" value="${data.loanLimitedEndTime.time - now.time}"></c:set>
<c:set var="leftDays" value="${timeMis/1000/3600/24+1}"/>
<fmt:formatNumber var="leftDaysFloor" value="${leftDays+(leftDays%1==0?0:-0.5)}" pattern="#"/>