Author: sebb
Date: Tue Feb 11 02:53:03 2014
New Revision: 1566967

URL: http://svn.apache.org/r1566967
Log:
LANG-971 NumberUtils#isNumber(String) fails to reject invalid Octal numbers

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=1566967&r1=1566966&r2=1566967&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/changes/changes.xml [utf-8] (original)
+++ commons/proper/lang/trunk/src/changes/changes.xml [utf-8] Tue Feb 11 
02:53:03 2014
@@ -22,6 +22,7 @@
   <body>
 
   <release version="3.3" date="TBA" description="Bugfix and Feature release">
+    <action issue="LANG-971" type="fix" 
dev="sebb">NumberUtils#isNumber(String) fails to reject invalid Octal 
numbers</action>
     <action issue="LANG-972" type="fix" dev="sebb">NumberUtils#isNumber does 
not allow for hex 0XABCD</action>
     <action issue="LANG-969" type="fix" dev="ggregory" due-to="Matt 
Bishop">StringUtils.toEncodedString(byte[], Charset) needlessly throws 
UnsupportedEncodingException</action>
     <action issue="LANG-970" type="add" dev="ggregory">Add APIs MutableBoolean 
setTrue() and setFalse()</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=1566967&r1=1566966&r2=1566967&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
 Tue Feb 11 02:53:03 2014
@@ -1345,26 +1345,33 @@ public class NumberUtils {
         boolean foundDigit = false;
         // deal with any possible sign up front
         final int start = (chars[0] == '-') ? 1 : 0;
-        if (sz > start + 1 && chars[start] == '0'
-                           && 
-                           (
-                             (chars[start + 1] == 'x') || 
-                             (chars[start + 1] == 'X') 
-                           )
-           ) {
-            int i = start + 2;
-            if (i == sz) {
-                return false; // str == "0x"
-            }
-            // checking hex (it can't be anything else)
-            for (; i < chars.length; i++) {
-                if ((chars[i] < '0' || chars[i] > '9')
-                    && (chars[i] < 'a' || chars[i] > 'f')
-                    && (chars[i] < 'A' || chars[i] > 'F')) {
-                    return false;
+        if (sz > start + 1 && chars[start] == '0') { // leading 0
+            if (
+                 (chars[start + 1] == 'x') || 
+                 (chars[start + 1] == 'X') 
+            ) { // leading 0x/0X
+                int i = start + 2;
+                if (i == sz) {
+                    return false; // str == "0x"
+                }
+                // checking hex (it can't be anything else)
+                for (; i < chars.length; i++) {
+                    if ((chars[i] < '0' || chars[i] > '9')
+                        && (chars[i] < 'a' || chars[i] > 'f')
+                        && (chars[i] < 'A' || chars[i] > 'F')) {
+                        return false;
+                    }
                 }
-            }
-            return true;
+                return true;
+           } else { // leading 0, but not hex, must be octal
+               int i = start + 1;
+               for (; i < chars.length; i++) {
+                   if (chars[i] < '0' || chars[i] > '7') {
+                       return false;
+                   }
+               }
+               return true;               
+           }
         }
         sz--; // don't want to loop to the last char, check it afterwords
               // for type qualifiers

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=1566967&r1=1566966&r2=1566967&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
 Tue Feb 11 02:53:03 2014
@@ -1226,6 +1226,15 @@ public class NumberUtilsTest {
     }
 
     @Test
+    public void testLANG971() {
+        compareIsNumberWithCreateNumber("0085", false);
+        compareIsNumberWithCreateNumber("085", false);
+        compareIsNumberWithCreateNumber("08", false);
+        compareIsNumberWithCreateNumber("07", true);
+        compareIsNumberWithCreateNumber("00", true);
+    }
+
+    @Test
     public void testLANG972() {
         compareIsNumberWithCreateNumber("0xABCD", true);
         compareIsNumberWithCreateNumber("0XABCD", true);


Reply via email to