Author: britter Date: Sun Mar 1 16:48:22 2015 New Revision: 1663129 URL: http://svn.apache.org/r1663129 Log: LANG-1087: NumberUtils#createNumber() returns positive BigDecimal when negative Float is expected. Thanks to Renat Zhilkibaev.
Modified: commons/proper/lang/trunk/src/changes/changes.xml commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/NumberUtils.java commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java Modified: commons/proper/lang/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/changes/changes.xml?rev=1663129&r1=1663128&r2=1663129&view=diff ============================================================================== --- commons/proper/lang/trunk/src/changes/changes.xml [utf-8] (original) +++ commons/proper/lang/trunk/src/changes/changes.xml [utf-8] Sun Mar 1 16:48:22 2015 @@ -22,6 +22,7 @@ <body> <release version="3.4" date="tba" description="tba"> + <action issue="LANG-1087" type="fix" dev="britter" due-to="Renat Zhilkibaev">NumberUtils#createNumber() returns positive BigDecimal when negative Float is expected</action> <action issue="LANG-1081" type="fix" dev="britter" due-to="Jonathan Baker">DiffBuilder.append(String, Object left, Object right) does not do a left.equals(right) check</action> <action issue="LANG-1055" type="fix" dev="britter" due-to="Jonathan Baker">StrSubstitutor.replaceSystemProperties does not work consistently</action> <action issue="LANG-1082" type="add" dev="britter" due-to="Jonathan Baker">Add option to disable the "objectsTriviallyEqual" test in DiffBuilder</action> Modified: commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/NumberUtils.java URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/NumberUtils.java?rev=1663129&r1=1663128&r2=1663129&view=diff ============================================================================== --- commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/NumberUtils.java (original) +++ commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/NumberUtils.java Sun Mar 1 16:48:22 2015 @@ -503,16 +503,16 @@ public class NumberUtils { } else { dec = str.substring(decPos + 1); } - mant = str.substring(0, decPos); + mant = getMantissa(str, decPos); numDecimals = dec.length(); // gets number of digits past the decimal to ensure no loss of precision for floating point numbers. } else { if (expPos > -1) { if (expPos > str.length()) { // prevents double exponent causing IOOBE throw new NumberFormatException(str + " is not a valid number."); } - mant = str.substring(0, expPos); + mant = getMantissa(str, expPos); } else { - mant = str; + mant = getMantissa(str); } dec = null; } @@ -624,6 +624,34 @@ public class NumberUtils { } /** + * <p>Utility method for {@link #createNumber(java.lang.String)}.</p> + * + * <p>Returns mantissa of the given number.</p> + * + * @param str the string representation of the number + * @return mantissa of the given number + */ + private static String getMantissa(final String str) { + return getMantissa(str, str.length()); + } + + /** + * <p>Utility method for {@link #createNumber(java.lang.String)}.</p> + * + * <p>Returns mantissa of the given number.</p> + * + * @param str the string representation of the number + * @param stopPos the position of the exponent or decimal point + * @return mantissa of the given number + */ + private static String getMantissa(final String str, final int stopPos) { + final char firstChar = str.charAt(0); + final boolean hasSign = (firstChar == '-' || firstChar == '+'); + + return hasSign ? str.substring(1, stopPos) : str.substring(0, stopPos); + } + + /** * <p>Utility method for {@link #createNumber(java.lang.String)}.</p> * * <p>Returns <code>true</code> if s is <code>null</code>.</p> Modified: commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java?rev=1663129&r1=1663128&r2=1663129&view=diff ============================================================================== --- commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java (original) +++ commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java Sun Mar 1 16:48:22 2015 @@ -245,6 +245,19 @@ public class NumberUtilsTest { assertNotNull(bigNum); assertEquals(BigDecimal.class, bigNum.getClass()); } + + @Test + public void testLang1087(){ + // no sign cases + assertEquals(Float.class, NumberUtils.createNumber("0.0").getClass()); + assertEquals(Float.valueOf("0.0"), NumberUtils.createNumber("0.0")); + // explicit positive sign cases + assertEquals(Float.class, NumberUtils.createNumber("+0.0").getClass()); + assertEquals(Float.valueOf("+0.0"), NumberUtils.createNumber("+0.0")); + // negative sign cases + assertEquals(Float.class, NumberUtils.createNumber("-0.0").getClass()); + assertEquals(Float.valueOf("-0.0"), NumberUtils.createNumber("-0.0")); + } @Test public void TestLang747() {