web-dev-qa-db-fra.com

Comment arrondir un nombre en JSTL?

Je fais une division dans un JSP et j'aimerais arrondir le résultat - comment dois-je faire cela?

c'est à dire.

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

... comment arrondir le résultat?

Merci,

30
brabster

Comme alternative:

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

De cette façon, vous ne perdez pas la localisation (virgules et points).

55
brabster

J'ai utilisé:

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

qui tronque plutôt que d'arrondir, mais cela peut être suffisant.

9
mm2001

Cela peut ressembler à:

<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: je pense que vous devriez utiliser mod de toute façon ou % fonctionnalité de jstl, j'utilise mod dans l'exemple. Testez, s'il vous plaît, les variables "expirer" et "maintenant" avec des valeurs différentes, devraient fonctionner correctement.

2
sergionni

Et ce sale hack:

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

Mais je le ferais dans un bean et montrerais juste le résultat ici. En plus de cela, vous pouvez définir des fonctions dans votre tld ou, si cela n'est pas pris en charge dans votre environnement, obtenir des fonctions dans le langage d'expression en implémentant une carte et (ab) l'utiliser. Vous implémentez la méthode get (Object) pour faire ce que vous voulez et l'appelez comme ceci:

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

Remarque, Helpers fournit une méthode "getRound ()" qui retourne votre implémentation Map.

1
Tim Büthe

Avec la version EL actuelle, vous pouvez utiliser

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

ou

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