Skip to content

Commit fa59a31

Browse files
authored
[LANG-1821] NumberUtils.isCreatable fails for hexadecimal numbers with long type qualifier (#1629)
* Add testLang1641() * Rename some test methods * [LANG-1821] NumberUtils.isCreatable fails for hexadecimal numbers with long type qualifier
1 parent 2062efa commit fa59a31

2 files changed

Lines changed: 34 additions & 2 deletions

File tree

src/main/java/org/apache/commons/lang3/math/NumberUtils.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ public static Number createNumber(final String str) {
365365
break;
366366
}
367367
}
368+
final char lastChar = str.charAt(length - 1);
368369
if (pfxLen > 0) { // we have a hex number
369370
char firstSigDigit = 0; // strip leading zeroes
370371
for (int i = pfxLen; i < length; i++) {
@@ -374,16 +375,22 @@ public static Number createNumber(final String str) {
374375
}
375376
pfxLen++;
376377
}
377-
final int hexDigits = length - pfxLen;
378+
final boolean isLongCh = lastChar == 'l' || lastChar == 'L';
379+
int hexDigits = length - pfxLen;
380+
if (isLongCh) {
381+
hexDigits--;
382+
}
378383
if (hexDigits > 16 || hexDigits == 16 && firstSigDigit > '7') { // too many for Long
379384
return createBigInteger(str);
380385
}
386+
if (isLongCh) {
387+
return createLong(str.substring(0, str.length() - 1));
388+
}
381389
if (hexDigits > 8 || hexDigits == 8 && firstSigDigit > '7') { // too many for an int
382390
return createLong(str);
383391
}
384392
return createInteger(str);
385393
}
386-
final char lastChar = str.charAt(length - 1);
387394
final String mant;
388395
final String dec;
389396
final String exp;

src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,6 +1232,31 @@ void testLang1729IsParsableShort() {
12321232
assertFalse(isParsableShort("1 2 3"));
12331233
}
12341234

1235+
/**
1236+
* Tests <a href="https://issues.apache.org/jira/browse/LANG-1821">LANG-1821</a>.
1237+
*/
1238+
@Test
1239+
void testLang1821() {
1240+
compareIsCreatableWithCreateNumber("123L", true);
1241+
compareIsCreatableWithCreateNumber("0xdef", true);
1242+
compareIsCreatableWithCreateNumber("0xdefL", true);
1243+
compareIsCreatableWithCreateNumber("0XDEFl", true);
1244+
// Integer.MAX_VALUE
1245+
compareIsCreatableWithCreateNumber("0x" + Integer.toHexString(Integer.MAX_VALUE), true);
1246+
compareIsCreatableWithCreateNumber("0x" + Integer.toHexString(Integer.MAX_VALUE) + "l", true);
1247+
compareIsCreatableWithCreateNumber("0x" + Integer.toHexString(Integer.MAX_VALUE) + "L", true);
1248+
compareIsCreatableWithCreateNumber("0X" + Integer.toHexString(Integer.MAX_VALUE), true);
1249+
compareIsCreatableWithCreateNumber("0X" + Integer.toHexString(Integer.MAX_VALUE) + "l", true);
1250+
compareIsCreatableWithCreateNumber("0X" + Integer.toHexString(Integer.MAX_VALUE) + "L", true);
1251+
// Long.MAX_VALUE
1252+
compareIsCreatableWithCreateNumber("0x" + Long.toHexString(Long.MAX_VALUE), true);
1253+
compareIsCreatableWithCreateNumber("0x" + Long.toHexString(Long.MAX_VALUE) + "l", true);
1254+
compareIsCreatableWithCreateNumber("0x" + Long.toHexString(Long.MAX_VALUE) + "L", true);
1255+
compareIsCreatableWithCreateNumber("0X" + Long.toHexString(Long.MAX_VALUE), true);
1256+
compareIsCreatableWithCreateNumber("0X" + Long.toHexString(Long.MAX_VALUE) + "l", true);
1257+
compareIsCreatableWithCreateNumber("0X" + Long.toHexString(Long.MAX_VALUE) + "L", true);
1258+
}
1259+
12351260
@Test
12361261
void testLang300() {
12371262
NumberUtils.createNumber("-1l");

0 commit comments

Comments
 (0)