Come arrotondare un numero in JSTL?
Domanda
Sto facendo una divisione in un JSP e vorrei arrotondare il risultato - come dovrei farlo?
vale a dire.
<c:set
var="expiry"
value="${(expire.time - now.time) / (60 * 1000)}"/>
... come arrotondare il risultato?
Grazie,
Soluzione
In alternativa:
<fmt:formatNumber var="expiry"
value="${(expire.time - now.time) / (60 * 1000)}"
maxFractionDigits="0" />
In questo modo non si perde la localizzazione (virgole e punti).
Altri suggerimenti
Ho usato:
${fn:substringBefore(expiry, '.')}
che tronca anziché arrotondare, ma potrebbe essere abbastanza buono.
Potrebbe apparire come:
<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>
nota: penso che dovresti usare mod comunque o % funzionalità di jstl, io uso la mod in esempio. Prova, per favore, " scadere " e "ora" variabili con valori diversi, dovrebbero funzionare bene.
Che dire di questo sporco hack:
<c:set
var="expiry"
value="${(((expire.time - now.time) / (60 * 1000) * 100) - 0.5) / 100.0}"/>
Ma lo farei in un bean e mostrerei il risultato qui. Inoltre, puoi definire funzioni nella tua tld o, se ciò non è supportato nel tuo ambiente ottenere funzioni nel linguaggio delle espressioni implementando una mappa e (ab) usarla. Implementate il metodo get (Object) per fare ciò che volete e chiamatelo così:
<c:set
var="expiry"
value="${Helpers.round[(expire.time - now.time) / (60 * 1000)]"/>
Nota, Helpers fornisce un " getRound () " metodo che restituisce l'implementazione della mappa.
Con l'attuale versione EL puoi usare
<c:set var="expiry"
value="${Math.round( (expire.time - now.time) / (60 * 1000) )}"/>
o
<c:set var="expiry"
value="${Math.floor( (expire.time - now.time) / (60 * 1000) )}"/>