This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-lang.git
commit ec5319a7e354ef09b41a39ab73fa310efd56be30 Author: Gary D. Gregory <garydgreg...@gmail.com> AuthorDate: Sun Jun 15 08:10:30 2025 -0400 Add org.apache.commons.lang3.CharUtils.isOctal(char) --- src/changes/changes.xml | 1 + .../java/org/apache/commons/lang3/CharUtils.java | 11 +++++++++++ .../org/apache/commons/lang3/math/NumberUtils.java | 6 +++--- .../commons/lang3/text/translate/OctalUnescaper.java | 20 +++++--------------- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index db1b12a31..119871bc7 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -129,6 +129,7 @@ The <action> type attribute can be add,update,fix,remove. <action type="add" dev="ggregory" due-to="Pankraz76, Gary Gregory">Add ObjectUtils.getIfNull(Object, Object) and deprecate defaultIfNull(Object, Object).</action> <action type="add" dev="ggregory" due-to="Gary Gregory">org.apache.commons.lang3.mutable.Mutable now extends Supplier.</action> <action type="add" dev="ggregory" due-to="Gary Gregory">Add org.apache.commons.lang3.CharUtils.isHex(char).</action> + <action type="add" dev="ggregory" due-to="Gary Gregory">Add org.apache.commons.lang3.CharUtils.isOctal(char).</action> <!-- UPDATE --> <action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">Bump org.apache.commons:commons-parent from 73 to 84 #1267, #1277, #1283, #1288, #1302, #1377.</action> <action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">[site] Bump org.codehaus.mojo:taglist-maven-plugin from 3.1.0 to 3.2.1 #1300.</action> diff --git a/src/main/java/org/apache/commons/lang3/CharUtils.java b/src/main/java/org/apache/commons/lang3/CharUtils.java index ed90518cd..b82519f5c 100644 --- a/src/main/java/org/apache/commons/lang3/CharUtils.java +++ b/src/main/java/org/apache/commons/lang3/CharUtils.java @@ -255,6 +255,17 @@ public static boolean isHex(final char ch) { return isAsciiNumeric(ch) || ch >= 'a' && ch <= 'f' || ch >= 'A' && ch <= 'F'; } + /** + * Tests if the given char is an octal digit. Octal digits are the character representations of the digits 0 to 7. + * + * @param ch the char to check + * @return true if the given char is the character representation of one of the digits from 0 to 7 + * @since 3.18.0 + */ + public static boolean isOctal(final char ch) { + return ch >= '0' && ch <= '7'; + } + /** * Converts the Character to a char throwing an exception for {@code null}. * diff --git a/src/main/java/org/apache/commons/lang3/math/NumberUtils.java b/src/main/java/org/apache/commons/lang3/math/NumberUtils.java index e35f48047..ada805324 100644 --- a/src/main/java/org/apache/commons/lang3/math/NumberUtils.java +++ b/src/main/java/org/apache/commons/lang3/math/NumberUtils.java @@ -582,7 +582,7 @@ public static boolean isCreatable(final String str) { // leading 0, but not hex, must be octal int i = start + 1; for (; i < chars.length; i++) { - if (chars[i] < '0' || chars[i] > '7') { + if (!CharUtils.isOctal(chars[i])) { return false; } } @@ -595,7 +595,7 @@ public static boolean isCreatable(final String str) { // loop to the next to last char or to the last char if we need another digit to // make a valid number (e.g. chars[0..5] = "1234E") while (i < sz || i < sz + 1 && allowSigns && !foundDigit) { - if (chars[i] >= '0' && chars[i] <= '9') { + if (CharUtils.isAsciiNumeric(chars[i])) { foundDigit = true; allowSigns = false; @@ -628,7 +628,7 @@ public static boolean isCreatable(final String str) { i++; } if (i < chars.length) { - if (chars[i] >= '0' && chars[i] <= '9') { + if (CharUtils.isAsciiNumeric(chars[i])) { // no type qualifier, OK return true; } diff --git a/src/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java b/src/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java index 3bc7c2415..17a905990 100644 --- a/src/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java +++ b/src/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java @@ -19,6 +19,8 @@ import java.io.IOException; import java.io.Writer; +import org.apache.commons.lang3.CharUtils; + /** * Translate escaped octal Strings back to their octal values. * @@ -42,15 +44,6 @@ public OctalUnescaper() { // empty } - /** - * Checks if the given char is an octal digit. Octal digits are the character representations of the digits 0 to 7. - * @param ch the char to check - * @return true if the given char is the character representation of one of the digits from 0 to 7 - */ - private boolean isOctalDigit(final char ch) { - return ch >= '0' && ch <= '7'; - } - /** * Checks if the given char is the character representation of one of the digit from 0 to 3. * @param ch the char to check @@ -67,21 +60,18 @@ private boolean isZeroToThree(final char ch) { public int translate(final CharSequence input, final int index, final Writer out) throws IOException { final int remaining = input.length() - index - 1; // how many characters left, ignoring the first \ final StringBuilder builder = new StringBuilder(); - if (input.charAt(index) == '\\' && remaining > 0 && isOctalDigit(input.charAt(index + 1))) { + if (input.charAt(index) == '\\' && remaining > 0 && CharUtils.isOctal(input.charAt(index + 1))) { final int next = index + 1; final int next2 = index + 2; final int next3 = index + 3; - // we know this is good as we checked it in the if block above builder.append(input.charAt(next)); - - if (remaining > 1 && isOctalDigit(input.charAt(next2))) { + if (remaining > 1 && CharUtils.isOctal(input.charAt(next2))) { builder.append(input.charAt(next2)); - if (remaining > 2 && isZeroToThree(input.charAt(next)) && isOctalDigit(input.charAt(next3))) { + if (remaining > 2 && isZeroToThree(input.charAt(next)) && CharUtils.isOctal(input.charAt(next3))) { builder.append(input.charAt(next3)); } } - out.write(Integer.parseInt(builder.toString(), 8)); return 1 + builder.length(); }