[ VM / Service ] Updated JSONWriter::PrintValue(double) to use double_conversion instead of Printf.

Fixes #31737

Change-Id: If70b7b6bdd1e977bda310a2b0566dcd48c6b3c6a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/101101
Commit-Queue: Ben Konyi <bkonyi@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/vm/json_test.cc b/runtime/vm/json_test.cc
index 1746328..d25d01d 100644
--- a/runtime/vm/json_test.cc
+++ b/runtime/vm/json_test.cc
@@ -61,7 +61,7 @@
       JSONArray jsarr(&js);
       jsarr.AddValue(1.0);
     }
-    EXPECT_STREQ("[1.000000]", js.ToCString());
+    EXPECT_STREQ("[1.0]", js.ToCString());
   }
   {
     JSONStream js;
diff --git a/runtime/vm/json_writer.cc b/runtime/vm/json_writer.cc
index 77112ae..587bf15 100644
--- a/runtime/vm/json_writer.cc
+++ b/runtime/vm/json_writer.cc
@@ -5,6 +5,7 @@
 #include "platform/assert.h"
 
 #include "platform/unicode.h"
+#include "vm/double_conversion.h"
 #include "vm/json_writer.h"
 #include "vm/object.h"
 
@@ -117,8 +118,13 @@
 }
 
 void JSONWriter::PrintValue(double d) {
+  // Max length of a double in characters (including \0).
+  // See double_conversion.cc.
+  const size_t kBufferLen = 25;
+  char buffer[kBufferLen];
+  DoubleToCString(d, buffer, kBufferLen);
   PrintCommaIfNeeded();
-  buffer_.Printf("%f", d);
+  buffer_.Printf("%s", buffer);
 }
 
 static const char base64_digits[65] =
diff --git a/runtime/vm/metrics_test.cc b/runtime/vm/metrics_test.cc
index 6ca6726..4482a6d 100644
--- a/runtime/vm/metrics_test.cc
+++ b/runtime/vm/metrics_test.cc
@@ -67,7 +67,7 @@
         "{\"type\":\"Counter\",\"name\":\"a.b.c\",\"description\":"
         "\"foobar\",\"unit\":\"byte\","
         "\"fixedId\":true,\"id\":\"metrics\\/native\\/a.b.c\""
-        ",\"value\":99.000000}",
+        ",\"value\":99.0}",
         json);
   }
   Dart_ShutdownIsolate();