java - operator - Comprobando si un valor BigDecimal es cero en una expresión EL de JSP
java bigdecimal mayor a cero (5)
Con la última versión de EL (compatible con Tomcat 7 por ejemplo), puedes probar:
<c:if test="${someBigDecimal.doubleValue() == 0}">
Lo siguiente no siempre se comporta como cabría esperar:
<c:if test="${someBigDecimal == 0}">
Si someBigDecimal tiene un valor de 0, pero tiene una escala distinta de 0, la operación == devuelve falso. Es decir, devuelve true cuando someBigDecimal es nuevo BigDecimal ("0"), pero false cuando someBigDecimal es nuevo BigDecimal ("0.00").
Esto se debe a las especificaciones JSP 2.0, 2.1 y 2.2, que establecen:
Para <,>, <=,> =:
Si A o B es BigDecimal, obligue a A y B a BigDecimal y use el valor de retorno de A.compareTo (B).
Para ==,! =:
Si A o B es BigDecimal, obligue a A y B a BigDecimal y luego:
- Si el operador es ==, devuelve A.equals (B)
- Si el operador es! =, Regrese! A.equals (B)
Esto significa que los operadores ==
y !=
.equals()
resultado una llamada al método .equals()
, que compara no solo los valores, sino también la escala de los BigDecimals. Los otros operadores de comparación dan como resultado una llamada al método .compareTo()
, que compara solo los valores.
Por supuesto, lo siguiente funcionaría:
<c:if test="${not ((someBigDecimal < 0) or (someBigDecimal > 0))}">
Pero esto es bastante feo, ¿hay una mejor manera de hacerlo?
En JSP 2.2 EL y por encima de esta expresión se evaluará como true
:
${someBigDecimal.unscaledValue() == 0}
Esto evitará cualquier pérdida de precisión, pero supone que someBigDecimal
es siempre de tipo BigDecimal
.
Una función EL personalizada es probablemente el mejor enfoque para versiones anteriores de EL:
${fn:isZero(someBigDecimal)}
El núcleo del problema es que este código de Java se evalúa como false
porque ZERO
tiene una scale de 0
y el nuevo BigDecimal
tiene una escala distinta de cero:
BigDecimal.ZERO.setScale(3).equals(BigDecimal.ZERO)
Puedes probar la función signum:
<c:if test="#{someBigDecimal.signum() == 0}">
<c:if test="${someBigDecimal eq 0}">
<c:if test="${someBigDecimal.compareTo(BigDecimal.ZERO) == 0}">