Como posso arredondar um número em JSTL?
Pergunta
Estou fazendo uma divisão em um JSP e eu gostaria de arredondar o resultado - como eu deveria fazer isso
i.
<c:set
var="expiry"
value="${(expire.time - now.time) / (60 * 1000)}"/>
... como faço para arredondar o resultado?
Obrigado,
Solução
Como alternativa:
<fmt:formatNumber var="expiry"
value="${(expire.time - now.time) / (60 * 1000)}"
maxFractionDigits="0" />
Desta forma, você não localização Lose (vírgulas e pontos).
Outras dicas
eu usei:
${fn:substringBefore(expiry, '.')}
que trunca em vez de arredondamento, mas que pode ser bom o suficiente.
Pode se parece com:
<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: Eu acho que você deve usar mod de qualquer maneira ou % funcionalidade do JSTL, eu uso mod no exemplo. Teste, por favor, "expira" e "agora" variáveis ??com valores diferentes, deve funcionar ok.
O que sobre esse truque sujo:
<c:set
var="expiry"
value="${(((expire.time - now.time) / (60 * 1000) * 100) - 0.5) / 100.0}"/>
Mas eu faria isso em um bean e apenas mostrar o resultado aqui. Ao lado disso, você pode definir funções em seu TLD ou, se isso não é suportado no seu ambiente obter funções na linguagem de expressão através da implementação de um mapa e de (ab) uso. Você implementar o método get (Object) para fazer o que quiser e chamá-lo assim:
<c:set
var="expiry"
value="${Helpers.round[(expire.time - now.time) / (60 * 1000)]"/>
Note, Ajudantes fornece um "getRound ()" método que retorna a sua implementação Mapa. ??
Com a versão atual EL você pode usar
<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) )}"/>