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

Reply via email to