Alex Herbert created LANG-1645:
----------------------------------

             Summary: NumberUtils.createNumber/createBigInteger fails on 
hexidecimal integers prefixed with +
                 Key: LANG-1645
                 URL: https://issues.apache.org/jira/browse/LANG-1645
             Project: Commons Lang
          Issue Type: Bug
          Components: lang.math.*
    Affects Versions: 3.12.0
            Reporter: Alex Herbert
            Assignee: Alex Herbert


The Java Language Specification allows an optional sign prefix for a number as 
+ or -.

A + sign before a hex integer is not recognised by createNumber and 
createBigInteger but is recognised by isCreatable, createInteger and 
createLong. The two later functions delegate to Java's decode() function that 
handles an optional leading +.

The following demonstrates the tests that fail but would pass if the leading 
'+' is removed.
{code:java}
    @Test
    void testCreatePositiveHexInteger() {
        // Hex is only supported for integers so no test for hex floating point 
formats
        assertTrue(NumberUtils.isCreatable("+0xF"));
        assertTrue(NumberUtils.isCreatable("+0xFFFFFFFF"));
        assertTrue(NumberUtils.isCreatable("+0xFFFFFFFFFFFFFFFFF"));

        assertEquals(Integer.decode("+0xF"), NumberUtils.createInteger("+0xF"));
        assertEquals(Long.decode("+0xFFFFFFFF"), 
NumberUtils.createLong("+0xFFFFFFFF"));

        assertEquals(new BigInteger("+FFFFFFFFFFFFFFFF", 16),
                     NumberUtils.createBigInteger("0xFFFFFFFFFFFFFFFF"));
        try {
            assertEquals(new BigInteger("+FFFFFFFFFFFFFFFF", 16),
                         NumberUtils.createBigInteger("+0xFFFFFFFFFFFFFFFF"));
            Assertions.fail("This should be possible but it is not");
        } catch (NumberFormatException ex) {
            // This should not happen
        }

        assertEquals(Integer.decode("+0xF"),
                     NumberUtils.createNumber("0xF"));
        try {
            assertEquals(Integer.decode("+0xF"),
                         NumberUtils.createNumber("+0xF"));
            Assertions.fail("This should be possible but it is not");
        } catch (NumberFormatException ex) {
            // This should not happen
        }

        assertEquals(Long.decode("+0xFFFFFFFF"),
                     NumberUtils.createNumber("0xFFFFFFFF"));
        try {
            assertEquals(Long.decode("+0xFFFFFFFF"),
                         NumberUtils.createNumber("+0xFFFFFFFF"));
            Assertions.fail("This should be possible but it is not");
        } catch (NumberFormatException ex) {
            // This should not happen
        }

        assertEquals(new BigInteger("+FFFFFFFFFFFFFFFF", 16),
                     NumberUtils.createNumber("0xFFFFFFFFFFFFFFFF"));
        try {
            assertEquals(new BigInteger("+FFFFFFFFFFFFFFFF", 16),
                         NumberUtils.createNumber("+0xFFFFFFFFFFFFFFFF"));
            Assertions.fail("This should be possible but it is not");
        } catch (NumberFormatException ex) {
            // This should not happen
        }
    }
{code}
A simple fix is to check for a leading '+' character and advance all processing 
past this character.
  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to