2009-09-18 20 views
29

Sto facendo una divisione in un JSP e vorrei arrotondare il risultato: come dovrei farlo?Come arrotondare un numero in JSTL?

cioè

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

... Come posso arrotondare il risultato?

Grazie,

risposta

54

In alternativa:

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

In questo modo non si perde di localizzazione (virgole e punti).

+2

Sono d'accordo con questa risposta. JSTL non dovrebbe preoccuparsi di "correttamente" implementare qualsiasi logica come l'arrotondamento. Questa è una decisione di medio livello. JSP e JSTL dovrebbero essere solo per la visualizzazione. Il tag di formato è la cosa giusta da fare. – duffymo

+0

Attenzione, dipende dalla locale corrente https://stackoverflow.com/a/16899830/1606662 – Chintsu

1

Che dire di questo sporco trucco:

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

Ma vorrei fare questo in un fagiolo e solo mostrare il risultato qui. Accanto a questo, è possibile define functions in your tld o, se non è supportato nel proprio ambiente, ottenere funzioni nel linguaggio delle espressioni implementando una mappa e (ab) usarlo. Si implementa il metodo get (Object) per fare quello che vuoi e chiamare in questo modo:

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

nota, Helpers fornisce un metodo "getRound()" che restituisce l'implementazione Map.

2

Può assomiglia:

<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 si dovrebbe usare mod comunque o % funzionalità di JSTL, io uso mod nell'esempio. Test, per favore, "expire" e "now" variabili con valori diversi, dovrebbe funzionare ok.

8

ho usato:

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

che tronca invece di arrotondamento, ma che può essere abbastanza buono.

+0

Proprio quello di cui avevo bisogno, troncare. Grazie! – Jan

+2

Fai attenzione, in alcune lingue il separatore decimale è la virgola (ad es. Spagnolo) –

Problemi correlati