Galera,
Estou trabalhando com o Hibernate validator 4 (JSR 303) e estou validando um campo utilizando a anotação @Digits, mas estou tendo um problema sério.
Preciso validar um valor com 3 casas decimais.
Ex:
...
@Digits(integer=12,fraction=3,message="O peso bruto do volume está fora dos limites. {contraint.digits}")
private Double pesoBruto;
..
Até ai beleza, mas o problema é que o usuario está me passando o valor 0.001 e a validação está dando erro, mas não teoria não era pra dar esse erro pois 0.001 tem 3 casas decimais.
Olhando o fonte da annotation @Digits percebi que usa o metodo toString para criar um BigDecimal para então pegar a parte inteira e a parte fracional do número:
...
public static boolean isValid(Number num) {
//null values are valid
if (num == null) {
return true;
}
BigDecimal bigNum;
if (num instanceof BigDecimal) {
bigNum = (BigDecimal) num;
} else {
bigNum = new BigDecimal(num.toString());
}
int integerPartLength = bigNum.precision() - bigNum.scale();
int fractionPartLength = bigNum.scale() < 0 ? 0 : bigNum.scale();
return (maxIntegerLength >= integerPartLength && maxFractionLength >= fractionPartLength);
}
...
O grande problema ta que quando tem a chamada de num.toString() o meu número que é 0.001 passa a ser 0.0010 e a validação falha.
Seria isso um bug da classe Double? ou eu que estou fazendo algo de errado ? alguém já passou por isso?
Abraços