in src/main/user-impl/java/com/mysql/cj/xdevapi/JsonParser.java [438:529]
static JsonNumber parseNumber(StringReader reader) throws IOException {
StringBuilder sb = null;
char lastChar = ' ';
boolean hasFractionalPart = false;
boolean hasExponent = false;
int intch;
while ((intch = reader.read()) != -1) {
char ch = (char) intch;
if (sb == null) {
// number is still not found
if (ch == '\u002D') {
// first char of number is minus
sb = new StringBuilder();
sb.append(ch);
} else if (ch >= '\u0030' && ch <= '\u0039') {
// first char of number is digit
sb = new StringBuilder();
sb.append(ch);
} else if (!whitespaceChars.contains(ch)) {
// only white spaces are allowed before value
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("JsonParser.1", new Character[] { ch }));
}
} else if (ch == '\u002D') {
// '-' is allowed only on first position and after exponent character
if (lastChar == 'E' || lastChar == 'e') {
sb.append(ch);
} else {
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("JsonParser.8", new Object[] { ch, sb.toString() }));
}
} else if (ch >= '\u0030' && ch <= '\u0039') { // 0-9
sb.append(ch);
} else if (ch == 'E' || ch == 'e') {
// exponent character is allowed only after a digit
if (lastChar >= '\u0030' && lastChar <= '\u0039') {
hasExponent = true;
sb.append(ch);
} else {
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("JsonParser.8", new Object[] { ch, sb.toString() }));
}
} else if (ch == '\u002E') {
// '.' is allowed only once, after a digit and not in exponent part
if (hasFractionalPart) {
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("JsonParser.10", new Object[] { ch, sb.toString() }));
}
if (hasExponent) {
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("JsonParser.11"));
}
if (lastChar >= '\u0030' && lastChar <= '\u0039') {
hasFractionalPart = true;
sb.append(ch);
} else {
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("JsonParser.8", new Object[] { ch, sb.toString() }));
}
} else if (ch == '\u002B') {
// '+' is allowed only once after exponent character
if (lastChar == 'E' || lastChar == 'e') {
sb.append(ch);
} else {
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("JsonParser.8", new Object[] { ch, sb.toString() }));
}
} else if (whitespaceChars.contains(ch) || isValidEndOfValue(ch)) {
// any whitespace, comma or right bracket character means the end of Number in case we already placed something to buffer
reader.reset(); // set reader position to last number char
break;
} else {
// no other characters are allowed after value
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("JsonParser.1", new Character[] { ch }));
}
lastChar = ch;
// it's safe to mark() here because the "higher" level marks won't be reset() once we start reading a number
reader.mark(1);
}
if (sb == null || sb.length() == 0) {
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("JsonParser.5"));
}
return new JsonNumber().setValue(sb.toString());
}