This is an automated email from the ASF dual-hosted git repository.
garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git
The following commit(s) were added to refs/heads/master by this push:
new 18063c1f6 strip L suffix for oversized hex literals in createNumber
(#1712)
18063c1f6 is described below
commit 18063c1f6d935d60d0e7341d68434ab4c88a34ee
Author: alhuda <[email protected]>
AuthorDate: Thu Jun 18 00:15:13 2026 +0530
strip L suffix for oversized hex literals in createNumber (#1712)
---
src/main/java/org/apache/commons/lang3/math/NumberUtils.java | 2 +-
src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)
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 11e45c032..0637a5ac2 100644
--- a/src/main/java/org/apache/commons/lang3/math/NumberUtils.java
+++ b/src/main/java/org/apache/commons/lang3/math/NumberUtils.java
@@ -386,7 +386,7 @@ public static Number createNumber(final String str) {
hexDigits--;
}
if (hexDigits > 16 || hexDigits == 16 && firstSigDigit > '7') { //
too many for Long
- return createBigInteger(str);
+ return createBigInteger(isLongCh ? str.substring(0, length -
1) : str);
}
if (isLongCh) {
return createLong(str.substring(0, str.length() - 1));
diff --git a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
index 840b68b72..dc0ac6450 100644
--- a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
@@ -661,6 +661,13 @@ void testCreateNumber() {
assertEquals(Integer.decode("+0xF"), NumberUtils.createNumber("+0xF"),
"createNumber(String) LANG-1645a failed");
assertEquals(Long.decode("+0xFFFFFFFF"),
NumberUtils.createNumber("+0xFFFFFFFF"), "createNumber(String) LANG-1645b
failed");
assertEquals(new BigInteger("+FFFFFFFFFFFFFFFF", 16),
NumberUtils.createNumber("+0xFFFFFFFFFFFFFFFF"), "createNumber(String)
LANG-1645c failed");
+ // A hex literal too large for a Long but carrying an explicit 'L'/'l'
type suffix must drop the suffix
+ // before falling back to BigInteger, matching the decimal path (e.g.
"12345678901234567890L").
+ assertEquals(new BigInteger("FFFFFFFFFFFFFFFF", 16),
NumberUtils.createNumber("0xFFFFFFFFFFFFFFFFL"));
+ assertEquals(new BigInteger("FFFFFFFFFFFFFFFF", 16),
NumberUtils.createNumber("0xFFFFFFFFFFFFFFFFl"));
+ assertEquals(new BigInteger("8000000000000000", 16),
NumberUtils.createNumber("0x8000000000000000L"));
+ assertEquals(new BigInteger("-FFFFFFFFFFFFFFFF", 16),
NumberUtils.createNumber("-0xFFFFFFFFFFFFFFFFL"));
+ assertEquals(new BigInteger("FFFFFFFFFFFFFFFF", 16),
NumberUtils.createNumber("#FFFFFFFFFFFFFFFFL"));
// Map to a BigDecimal, not a Float.
assertEquals(new BigDecimal("0.100000001490116121"),
NumberUtils.createNumber("0.100000001490116121"));
}