diff --git a/java/src/org/openqa/selenium/json/JsonInput.java b/java/src/org/openqa/selenium/json/JsonInput.java index 19b9f5179a777..aef7e4c5d0239 100644 --- a/java/src/org/openqa/selenium/json/JsonInput.java +++ b/java/src/org/openqa/selenium/json/JsonInput.java @@ -220,31 +220,43 @@ public String nextName() { */ public Number nextNumber() { expect(JsonType.NUMBER); + boolean decimal = false; StringBuilder builder = new StringBuilder(); // We know it's safe to use a do/while loop since the first character was a number - boolean fractionalPart = false; + boolean read = true; do { - char read = input.peek(); - if (Character.isDigit(read) - || read == '+' - || read == '-' - || read == 'e' - || read == 'E' - || read == '.') { - builder.append(input.read()); - } else { - break; + switch (input.peek()) { + case '-': + case '+': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + builder.append(input.read()); + break; + case '.': + case 'e': + case 'E': + decimal = true; + builder.append(input.read()); + break; + default: + read = false; } - - fractionalPart |= (read == '.'); - } while (true); + } while (read); try { - Number number = new BigDecimal(builder.toString()); - if (fractionalPart) { - return number.doubleValue(); + if (!decimal) { + return Long.valueOf(builder.toString()); } - return number.longValue(); + + return new BigDecimal(builder.toString()).doubleValue(); } catch (NumberFormatException e) { throw new JsonException("Unable to parse to a number: " + builder + ". " + input); } diff --git a/java/test/org/openqa/selenium/json/JsonTest.java b/java/test/org/openqa/selenium/json/JsonTest.java index 00ac585128e21..41deca0fc3767 100644 --- a/java/test/org/openqa/selenium/json/JsonTest.java +++ b/java/test/org/openqa/selenium/json/JsonTest.java @@ -63,6 +63,10 @@ void canReadANumber() { assertThat((Number) new Json().toType("42", Number.class)).isEqualTo(42L); assertThat((Integer) new Json().toType("42", Integer.class)).isEqualTo(42); assertThat((Double) new Json().toType("42", Double.class)).isEqualTo(42.0); + assertThat((Double) new Json().toType("4.2e+1", Double.class)).isEqualTo(42.0); + assertThat((Double) new Json().toType("42e+1", Double.class)).isEqualTo(420.0); + assertThat((Double) new Json().toType("42e-1", Double.class)).isEqualTo(4.2); + assertThat((Double) new Json().toType("4.2e-1", Double.class)).isEqualTo(0.42); } @Test