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);