2012-06-28 22 views

Respuesta

3

Esto simplemente es la standard behavior de java.text.NumberFormat usadas por <f:convertNumber>: Se recorta todos los registros tras el primer carácter no permitido-(por ejemplo letras o separadores de otros decimales que los definidos en la configuración regional de entrada). La conversión solo falla si el carácter ofensivo está al principio.

Realmente no me gusta este comportamiento porque un usuario puede no darse cuenta de que su valor erróneo se recortó, lo que provocó una autocorrección no intencionada y (lo que es peor) desapercibida en un valor incorrecto.

Curiosamente, los convertidores de números específicos se comportan de manera diferente. El uso de <f:converter converterId="javax.faces.Double" /> no maneja automáticamente la entrada no numérica, pero falla la conversión. Sin embargo, la etiqueta no posee los atributos adicionales de convertNumber, como minFractionDigits o símbolos de moneda.

Un enfoque diferente sería escribir su propio convertidor personalizado que amplíe el convertidor estándar como se describe in this answer. A continuación, puede verificar el valor de los caracteres y cancelar directamente el procesamiento posterior (lanzando una excepción de conversión correspondiente) si encuentra alguno. Si el valor ya está libre de caracteres, puede llamar al comportamiento estándar del convertidor del que deriva.

El inconveniente de ambas formas es que pierde las capacidades adicionales de convertNumber. No tiene atributos como minFractionDigits o currencySymbol en <f:converter>, por lo que si necesita esto, deberá buscar otra forma de pasar un parámetro. Nuestra implementación no requiere ninguno de estos, por lo que no he investigado más (hemos optado por el enfoque A), pero this answer presenta un enfoque para hacerlo.

Cuestiones relacionadas