2009-09-18 58 views
29

Estoy haciendo una división en un JSP y me gustaría redondear el resultado, ¿cómo debo hacer esto?¿Cómo redondeo un número en JSTL?

decir

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

... ¿cómo puedo redondear el resultado?

Gracias,

Respuesta

54

Como alternativa:

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

De esta forma no se pierde de localización (comas y puntos).

+2

Estoy de acuerdo con esta respuesta. JSTL no debería preocuparse por implementar "correctamente" ninguna lógica como el redondeo. Esa es una decisión de nivel medio. JSP y JSTL solo deben mostrarse. La etiqueta de formato es lo correcto para hacer. – duffymo

+0

Tenga en cuenta que depende de la configuración regional actual https://stackoverflow.com/a/16899830/1606662 – Chintsu

1

¿Qué pasa con este truco sucio:

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

Pero me gustaría hacer esto en un grano y simplemente mostrar el resultado aquí. Además de esto, puede define functions in your tld o, si eso no es compatible con su entorno, obtener funciones en el lenguaje de expresiones implementando un Mapa y (ab) usarlo. Se implementa el método get (Object) para hacer lo que quiere y lo llaman así:

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

Nota, ayudantes proporciona un método "getRound()" que devuelve su aplicación Mapas.

2

Puede parece:

<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: creo que se debe utilizar mod todos modos o % funcionalidad de jstl, utilizo mod en el ejemplo. Las variables de prueba, "expirar" y "ahora" con valores diferentes, deberían funcionar correctamente.

8

utilicé:

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

la que trunca en lugar de redondeo, pero que puede ser lo suficientemente bueno.

+0

Justo lo que necesitaba, truncar. ¡Gracias! – Jan

+2

Tenga cuidado, en algunos idiomas, el separador decimal es la coma (por ejemplo, español) –