Как мне округлить число в JSTL? - PullRequest
30 голосов
/ 18 сентября 2009

Я делаю деление в JSP и хочу округлить результат - как мне это сделать?

т.е.

<c:set
  var="expiry"
  value="${(expire.time - now.time) / (60 * 1000)}"/>

... как округлить результат?

Спасибо

Ответы [ 5 ]

55 голосов
/ 18 сентября 2009

Как альтернатива:

<fmt:formatNumber var="expiry"
  value="${(expire.time - now.time) / (60 * 1000)}"
  maxFractionDigits="0" />

Таким образом вы не потеряете локализацию (запятые и точки).

9 голосов
/ 03 ноября 2009

Я использовал:

${fn:substringBefore(expiry, '.')}

, который усекает, а не округляет, но этого может быть достаточно.

2 голосов
/ 18 сентября 2009

Может выглядеть так:

<c:set var="expire" value="100"/>
<c:set var="now" value="3"/>

<c:choose>
 <c:when test="${(expire mod now)!=0}">
  <c:set var="res" value="${(expire - (expire mod now))/now}"/>
  ${res}
 </c:when>
 <c:otherwise>
  <c:set var="res" value="${expire/now}"/>
  ${res}
 </c:otherwise>
</c:choose>

примечание: я думаю, вы должны использовать mod в любом случае или % функциональность jstl, я использую мод в качестве примера. Проверьте, пожалуйста, переменные "expire" и "now" с разными значениями, должны работать нормально.

1 голос
/ 18 сентября 2009

Как насчет этого грязного хака:

<c:set
  var="expiry"
  value="${(((expire.time - now.time) / (60 * 1000) * 100) - 0.5) / 100.0}"/>

Но я бы сделал это в бобе и просто показал бы результат здесь. Кроме того, вы можете определять функции в вашем tld или, если это не поддерживается в вашей среде, получать функции на языке выражений путем реализации Map и (ab) использовать ее. Вы реализуете метод get (Object), чтобы делать то, что хотите, и вызываете его так:

<c:set
  var="expiry"
  value="${Helpers.round[(expire.time - now.time) / (60 * 1000)]"/>

Обратите внимание, что Helpers предоставляет метод "getRound ()", который возвращает реализацию вашей карты.

0 голосов
/ 11 апреля 2019

С текущей версией EL вы можете использовать

<c:set var="expiry"
value="${Math.round( (expire.time - now.time) / (60 * 1000) )}"/>

или

<c:set var="expiry"
value="${Math.floor( (expire.time - now.time) / (60 * 1000) )}"/>
...