尹茂椿萱 created LANG-1821:
--------------------------

             Summary: NumberUtils.isCreatable fails for hexadecimal numbers 
with long type qualifier
                 Key: LANG-1821
                 URL: https://issues.apache.org/jira/browse/LANG-1821
             Project: Commons Lang
          Issue Type: Bug
    Affects Versions: 3.20.0
            Reporter: 尹茂椿萱


Description

According to Java language syntax, hexadecimal numeric literals can be combined 
with type qualifiers such as 'L' or 'l'. For example:

```java
long a = 0Xdefl; // valid Java literal, evaluates to 3567

However, {{NumberUtils.isCreatable(String)}} does not recognize such inputs as 
valid numbers.

This suggests an inconsistency between the documented capabilities and the 
actual implementation.
h2. Reproduction
 
 
import org.apache.commons.lang3.math.NumberUtils;

public class Test {
public static void main(String[] args) {
long a = 0Xdefl;
System.out.println(a); // 3567

System.out.println(NumberUtils.isCreatable("0Xdefl")); // false
}
}
 
h2. Additional Cases

The following cases illustrate the inconsistency more clearly:
 
 
NumberUtils.isCreatable("123L"); // true
NumberUtils.isCreatable("0xdef"); // true
NumberUtils.isCreatable("0xdefL"); // false (unexpected)
NumberUtils.isCreatable("0XDEFl"); // false (unexpected)
 
h2. Expected Behavior

Inputs such as {{"0xdefL"}} and {{"0Xdefl"}} should be recognized as valid 
numbers, and {{isCreatable}} should return {{{}true{}}}.
h2. Actual Behavior

{{NumberUtils.isCreatable("0Xdefl")}} returns {{{}false{}}}.
h2. Documentation Reference

The Javadoc for {{isCreatable}} states that:
 * Hexadecimal numbers with {{0x}} or {{0X}} prefixes are supported.
 * Numbers with type qualifiers (e.g., {{{}123L{}}}) are supported.

However, the combination of these two features (hexadecimal + type qualifier) 
is not handled correctly.
h2. Environment
 * Apache Commons Lang version: 3.x.x (please replace with your actual version)
 * Java version: (e.g., OpenJDK 17)

h2. Impact

This issue may lead to incorrect validation results when processing numeric 
strings that are valid Java literals, especially in contexts where hexadecimal 
values with type qualifiers are expected.
h2. Possible Cause

The parsing logic in {{isCreatable}} appears to handle hexadecimal prefixes and 
type qualifiers independently, but does not correctly support their combination.
h2. Suggested Fix

Extend the parsing logic to allow type qualifiers ({{{}L{}}}/{{{}l{}}}) after 
hexadecimal numeric literals, consistent with Java syntax and existing support 
for decimal numbers with qualifiers.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to