How do I round a number in JSTL?
Asked Answered
A

5

34

I'm doing a division in a JSP and I'd like to round the result - how should I do this?

i.e.

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

...how do I round the result?

Thanks,

Armil answered 18/9, 2009 at 9:12 Comment(0)
A
61

As an alternative:

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

This way you do not lose localization (commas and dots).

Armil answered 18/9, 2009 at 9:44 Comment(1)
I'd agree with this answer. JSTL should not be concerned with "properly" implementing any logic like rounding. That's a middle tier decision. JSP and JSTL should only be for display. The format tag is the correct thing to do.Circumstantial
M
10

I used:

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

which truncates rather than rounding, but that may be good enough.

Marlanamarlane answered 3/11, 2009 at 16:53 Comment(1)
Be careful, in some languages the decimal separator is the comma (e.g. Spanish)Hawes
Z
2

It may looks like:

<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>

note: i think you should use mod anyway or % functionality of jstl,i use mod in example. Test,please, "expire" and "now" variables with different values, should work ok.

Zebedee answered 18/9, 2009 at 9:38 Comment(0)
S
1

What about this dirty hack:

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

But I would do this in a bean and just show the result here. Beside this, you can define functions in your tld or, if that is not supported in your environment get functions in the expression language by implementing a Map and (ab)use it. You implement the get(Object) method to do what you want and call it like this:

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

Note, Helpers provides a "getRound()" method which returns your Map implementation.

Stringy answered 18/9, 2009 at 9:19 Comment(0)
F
1

With the current EL version you can use

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

or

<c:set var="expiry"
value="${Math.floor( (expire.time - now.time) / (60 * 1000) )}"/>
Flywheel answered 11/4, 2019 at 20:22 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.