Author: niallp Date: Wed Jul 11 21:53:26 2007 New Revision: 555489 URL: http://svn.apache.org/viewvc?view=rev&rev=555489 Log: BEANUTILS-44 FloatLocaleConverter cannot parse negative values - reported by Paul Jenkins
Modified: jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/locale/converters/FloatLocaleConverter.java jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/locale/converters/FloatLocaleConverterTestCase.java Modified: jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/locale/converters/FloatLocaleConverter.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/locale/converters/FloatLocaleConverter.java?view=diff&rev=555489&r1=555488&r2=555489 ============================================================================== --- jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/locale/converters/FloatLocaleConverter.java (original) +++ jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/locale/converters/FloatLocaleConverter.java Wed Jul 11 21:53:26 2007 @@ -214,8 +214,10 @@ */ protected Object parse(Object value, String pattern) throws ParseException { final Number parsed = (Number) super.parse(value, pattern); - if( Math.abs(parsed.doubleValue() - parsed.floatValue()) > parsed.floatValue() * 0.00001 ) { - throw new ConversionException("Suplied number is not of type Float: "+parsed.longValue()); + double doubleValue = parsed.doubleValue(); + double posDouble = (doubleValue >= (double)0) ? doubleValue : (doubleValue * (double)-1); + if (posDouble < Float.MIN_VALUE || posDouble > Float.MAX_VALUE) { + throw new ConversionException("Suplied number is not of type Float: "+parsed); } return new Float(parsed.floatValue()); // unlike superclass it returns Float type } Modified: jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/locale/converters/FloatLocaleConverterTestCase.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/locale/converters/FloatLocaleConverterTestCase.java?view=diff&rev=555489&r1=555488&r2=555489 ============================================================================== --- jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/locale/converters/FloatLocaleConverterTestCase.java (original) +++ jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/locale/converters/FloatLocaleConverterTestCase.java Wed Jul 11 21:53:26 2007 @@ -17,6 +17,8 @@ package org.apache.commons.beanutils.locale.converters; +import java.text.DecimalFormat; +import org.apache.commons.beanutils.ConversionException; /** * Test Case for the FloatLocaleConverter class. @@ -256,6 +258,49 @@ convertInvalid(converter, defaultValue); convertNull(converter, defaultValue); + } + + /** + * Test Float limits + */ + public void testFloatLimits() { + + converter = new FloatLocaleConverter(defaultLocale, defaultDecimalPattern); + DecimalFormat fmt = new DecimalFormat("#.#############################################################"); + + assertEquals(new Float(-0.12), converter.convert("-0.12")); + assertEquals("Positive Float.MAX_VALUE", new Float(Float.MAX_VALUE), converter.convert(fmt.format(Float.MAX_VALUE))); + assertEquals("Positive Float.MIN_VALUE", new Float(Float.MIN_VALUE), converter.convert(fmt.format(Float.MIN_VALUE))); + + assertEquals("Negative Float.MAX_VALUE", new Float(Float.MAX_VALUE * -1), converter.convert(fmt.format(Float.MAX_VALUE * -1))); + assertEquals("Negative Float.MIN_VALUE", new Float(Float.MIN_VALUE * -1), converter.convert(fmt.format(Float.MIN_VALUE * -1))); + + + try { + converter.convert(fmt.format((double)Float.MAX_VALUE * (double)10)); + fail("Positive Too Large should throw ConversionException"); + } catch (ConversionException e) { + // expected result + } + try { + converter.convert(fmt.format((double)Float.MAX_VALUE * (double)-10)); + fail("Negative Too Large should throw ConversionException"); + } catch (ConversionException e) { + // expected result + } + + try { + converter.convert(fmt.format((double)Float.MIN_VALUE / (double)10)); + fail("Positive Too Small should throw ConversionException"); + } catch (ConversionException e) { + // expected result + } + try { + converter.convert(fmt.format((double)Float.MIN_VALUE / (double)-10)); + fail("Negative Too Small should throw ConversionException"); + } catch (ConversionException e) { + // expected result + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]