diff --git a/src/main/java/org/apache/commons/validator/routines/DoubleValidator.java b/src/main/java/org/apache/commons/validator/routines/DoubleValidator.java index b28f20659..6f2bac488 100644 --- a/src/main/java/org/apache/commons/validator/routines/DoubleValidator.java +++ b/src/main/java/org/apache/commons/validator/routines/DoubleValidator.java @@ -193,10 +193,14 @@ public boolean minValue(final Double value, final double min) { */ @Override protected Object processParsedValue(final Object value, final Format formatter) { + final double doubleValue = ((Number) value).doubleValue(); + if (Double.isNaN(doubleValue) || Double.isInfinite(doubleValue)) { + return null; // NaN and the infinity symbol are not valid numbers + } if (value instanceof Double) { return value; } - return Double.valueOf(((Number) value).doubleValue()); + return Double.valueOf(doubleValue); } diff --git a/src/main/java/org/apache/commons/validator/routines/FloatValidator.java b/src/main/java/org/apache/commons/validator/routines/FloatValidator.java index 1c1632070..59284fa07 100644 --- a/src/main/java/org/apache/commons/validator/routines/FloatValidator.java +++ b/src/main/java/org/apache/commons/validator/routines/FloatValidator.java @@ -197,6 +197,9 @@ protected Object processParsedValue(final Object value, final Format formatter) final double doubleValue = ((Number) value).doubleValue(); + if (Double.isNaN(doubleValue) || Double.isInfinite(doubleValue)) { + return null; // NaN and the infinity symbol are not valid numbers + } if (doubleValue > 0) { if (doubleValue < Float.MIN_VALUE || doubleValue > Float.MAX_VALUE) { return null; diff --git a/src/test/java/org/apache/commons/validator/routines/DoubleValidatorTest.java b/src/test/java/org/apache/commons/validator/routines/DoubleValidatorTest.java index 813b86001..f0d529701 100644 --- a/src/test/java/org/apache/commons/validator/routines/DoubleValidatorTest.java +++ b/src/test/java/org/apache/commons/validator/routines/DoubleValidatorTest.java @@ -133,4 +133,17 @@ void testDoubleValidatorMethods() { assertFalse(DoubleValidator.getInstance().isValid(xxxx, pattern), "isValid(B) pattern"); assertFalse(DoubleValidator.getInstance().isValid(patternVal, pattern, Locale.GERMAN), "isValid(B) both"); } + + /** + * Test NaN and infinity symbols are rejected. + */ + @Test + void testNonFinite() { + final DoubleValidator validator = DoubleValidator.getInstance(); + assertNull(validator.validate("NaN", null, Locale.US), "validate(NaN)"); + assertNull(validator.validate("∞", null, Locale.US), "validate(Infinity)"); + assertNull(validator.validate("-∞", null, Locale.US), "validate(-Infinity)"); + assertFalse(validator.isValid("NaN", null, Locale.US), "isValid(NaN)"); + assertFalse(validator.isValid("∞", null, Locale.US), "isValid(Infinity)"); + } } diff --git a/src/test/java/org/apache/commons/validator/routines/FloatValidatorTest.java b/src/test/java/org/apache/commons/validator/routines/FloatValidatorTest.java index 7ba5d8dd6..cb45cf3bb 100644 --- a/src/test/java/org/apache/commons/validator/routines/FloatValidatorTest.java +++ b/src/test/java/org/apache/commons/validator/routines/FloatValidatorTest.java @@ -163,4 +163,17 @@ void testFloatValidatorMethods() { assertFalse(FloatValidator.getInstance().isValid(xxxx, pattern), "isValid(B) pattern"); assertFalse(FloatValidator.getInstance().isValid(patternVal, pattern, Locale.GERMAN), "isValid(B) both"); } + + /** + * Test NaN and infinity symbols are rejected. + */ + @Test + void testNonFinite() { + final FloatValidator validator = FloatValidator.getInstance(); + assertNull(validator.validate("NaN", null, Locale.US), "validate(NaN)"); + assertNull(validator.validate("∞", null, Locale.US), "validate(Infinity)"); + assertNull(validator.validate("-∞", null, Locale.US), "validate(-Infinity)"); + assertFalse(validator.isValid("NaN", null, Locale.US), "isValid(NaN)"); + assertFalse(validator.isValid("∞", null, Locale.US), "isValid(Infinity)"); + } }