diff --git a/AK/JsonParser.cpp b/AK/JsonParser.cpp index 323a0308f6..c84c35a38d 100644 --- a/AK/JsonParser.cpp +++ b/AK/JsonParser.cpp @@ -191,10 +191,21 @@ JsonValue JsonParser::parse_string() JsonValue JsonParser::parse_number() { Vector number_buffer; + Vector fraction_buffer; + + bool is_double = false; for (;;) { char ch = peek(); + if (ch == '.') { + is_double = true; + ++m_index; + continue; + } if (ch == '-' || (ch >= '0' && ch <= '9')) { - number_buffer.append(ch); + if (is_double) + fraction_buffer.append(ch); + else + number_buffer.append(ch); ++m_index; continue; } @@ -202,11 +213,31 @@ JsonValue JsonParser::parse_number() } StringView number_string(number_buffer.data(), number_buffer.size()); + StringView fraction_string(fraction_buffer.data(), fraction_buffer.size()); bool ok; - auto value = JsonValue(number_string.to_uint(ok)); - if (!ok) - value = JsonValue(number_string.to_int(ok)); - ASSERT(ok); + JsonValue value; + + if (is_double) { + int whole = number_string.to_uint(ok); + if (!ok) + whole = number_string.to_int(ok); + ASSERT(ok); + + int fraction = fraction_string.to_uint(ok); + ASSERT(ok); + + auto divider = 1; + for (size_t i = 0; i < fraction_buffer.size(); ++i) { + divider *= 10; + } + value = JsonValue((double)whole + ((double)fraction / divider)); + } else { + value = JsonValue(number_string.to_uint(ok)); + if (!ok) + value = JsonValue(number_string.to_int(ok)); + ASSERT(ok); + } + return value; }