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() {


Reply via email to