Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
a001c19
Add testLang1641()
garydgregory Jul 19, 2024
abb0ca4
Rename some test methods
garydgregory Jul 19, 2024
73e4c9d
Merge remote-tracking branch 'upstream/master'
garydgregory Jul 19, 2024
0bcc867
Merge remote-tracking branch 'upstream/master'
garydgregory Jul 20, 2024
3484d8a
Merge remote-tracking branch 'upstream/master'
garydgregory Nov 3, 2025
dec6a36
Merge remote-tracking branch 'upstream/master'
garydgregory Nov 5, 2025
d959b47
Merge remote-tracking branch 'upstream/master'
garydgregory Nov 11, 2025
78cfdd3
Merge remote-tracking branch 'upstream/master'
garydgregory Nov 17, 2025
dddab49
Merge remote-tracking branch 'upstream/master'
garydgregory Nov 18, 2025
550d4b9
Merge remote-tracking branch 'upstream/master'
garydgregory Nov 25, 2025
22e4e5e
Merge remote-tracking branch 'upstream/master'
garydgregory Nov 27, 2025
a5bcad2
Merge remote-tracking branch 'upstream/master'
garydgregory Jan 9, 2026
9c606b5
Merge remote-tracking branch 'upstream/master'
garydgregory Jan 9, 2026
17d776d
Merge remote-tracking branch 'upstream/master'
garydgregory Jan 9, 2026
cddcb72
Merge remote-tracking branch 'upstream/master'
garydgregory Jan 10, 2026
d7a972c
Merge remote-tracking branch 'upstream/master'
garydgregory Jan 25, 2026
1309d96
Merge remote-tracking branch 'upstream/master'
garydgregory Feb 21, 2026
102fcb0
Merge remote-tracking branch 'upstream/master'
garydgregory Apr 15, 2026
7522574
Merge remote-tracking branch 'upstream/master'
garydgregory Apr 15, 2026
eb393f1
Merge remote-tracking branch 'upstream/master'
garydgregory Apr 21, 2026
307d875
Merge remote-tracking branch 'upstream/master'
garydgregory Apr 25, 2026
36bcd9a
[LANG-1821] NumberUtils.isCreatable fails for hexadecimal numbers with
garydgregory Apr 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions src/main/java/org/apache/commons/lang3/math/NumberUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,7 @@ public static Number createNumber(final String str) {
break;
}
}
final char lastChar = str.charAt(length - 1);
if (pfxLen > 0) { // we have a hex number
char firstSigDigit = 0; // strip leading zeroes
for (int i = pfxLen; i < length; i++) {
Expand All @@ -374,16 +375,22 @@ public static Number createNumber(final String str) {
}
pfxLen++;
}
final int hexDigits = length - pfxLen;
final boolean isLongCh = lastChar == 'l' || lastChar == 'L';
int hexDigits = length - pfxLen;
if (isLongCh) {
hexDigits--;
}
if (hexDigits > 16 || hexDigits == 16 && firstSigDigit > '7') { // too many for Long
return createBigInteger(str);
}
if (isLongCh) {
return createLong(str.substring(0, str.length() - 1));
}
if (hexDigits > 8 || hexDigits == 8 && firstSigDigit > '7') { // too many for an int
return createLong(str);
}
return createInteger(str);
}
final char lastChar = str.charAt(length - 1);
final String mant;
final String dec;
final String exp;
Expand Down
25 changes: 25 additions & 0 deletions src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1232,6 +1232,31 @@ void testLang1729IsParsableShort() {
assertFalse(isParsableShort("1 2 3"));
}

/**
* Tests <a href="https://issues.apache.org/jira/browse/LANG-1821">LANG-1821</a>.
*/
@Test
void testLang1821() {
compareIsCreatableWithCreateNumber("123L", true);
compareIsCreatableWithCreateNumber("0xdef", true);
compareIsCreatableWithCreateNumber("0xdefL", true);
compareIsCreatableWithCreateNumber("0XDEFl", true);
// Integer.MAX_VALUE
compareIsCreatableWithCreateNumber("0x" + Integer.toHexString(Integer.MAX_VALUE), true);
compareIsCreatableWithCreateNumber("0x" + Integer.toHexString(Integer.MAX_VALUE) + "l", true);
compareIsCreatableWithCreateNumber("0x" + Integer.toHexString(Integer.MAX_VALUE) + "L", true);
compareIsCreatableWithCreateNumber("0X" + Integer.toHexString(Integer.MAX_VALUE), true);
compareIsCreatableWithCreateNumber("0X" + Integer.toHexString(Integer.MAX_VALUE) + "l", true);
compareIsCreatableWithCreateNumber("0X" + Integer.toHexString(Integer.MAX_VALUE) + "L", true);
// Long.MAX_VALUE
compareIsCreatableWithCreateNumber("0x" + Long.toHexString(Long.MAX_VALUE), true);
compareIsCreatableWithCreateNumber("0x" + Long.toHexString(Long.MAX_VALUE) + "l", true);
compareIsCreatableWithCreateNumber("0x" + Long.toHexString(Long.MAX_VALUE) + "L", true);
compareIsCreatableWithCreateNumber("0X" + Long.toHexString(Long.MAX_VALUE), true);
compareIsCreatableWithCreateNumber("0X" + Long.toHexString(Long.MAX_VALUE) + "l", true);
compareIsCreatableWithCreateNumber("0X" + Long.toHexString(Long.MAX_VALUE) + "L", true);
}

@Test
void testLang300() {
NumberUtils.createNumber("-1l");
Expand Down
Loading