Fix #3102 HtmlChart is uncolored

Closes #3697.

PiperOrigin-RevId: 168353082
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/chart/HtmlChartVisitor.java b/src/main/java/com/google/devtools/build/lib/profiler/chart/HtmlChartVisitor.java
index 4649326..b64341a 100644
--- a/src/main/java/com/google/devtools/build/lib/profiler/chart/HtmlChartVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/profiler/chart/HtmlChartVisitor.java
@@ -16,6 +16,7 @@
 
 import java.io.PrintStream;
 import java.util.List;
+import java.util.Locale;
 
 /**
  * {@link ChartVisitor} that builds HTML from the visited chart and prints it
@@ -310,16 +311,15 @@
     out.println("<a name='" + name + "'/>");
   }
 
-  /**
-   * Formats the given {@link Color} to a css style color string.
-   */
-  private String formatColor(Color color) {
+  /** Formats the given {@link Color} to a css style color string. */
+  public static String formatColor(Color color) {
     int r = color.getRed();
     int g = color.getGreen();
     int b = color.getBlue();
     int a = color.getAlpha();
 
-    return String.format("rgba(%d,%d,%d,%f)", r, g, b, (a / 255.0));
+    // US Locale is used to ensure a dot as decimal separator
+    return String.format(Locale.US, "rgba(%d,%d,%d,%f)", r, g, b, (a / 255.0));
   }
 
   /**
diff --git a/src/test/java/com/google/devtools/build/lib/profiler/ProfilerChartTest.java b/src/test/java/com/google/devtools/build/lib/profiler/ProfilerChartTest.java
index 0551881..e27ae16 100644
--- a/src/test/java/com/google/devtools/build/lib/profiler/ProfilerChartTest.java
+++ b/src/test/java/com/google/devtools/build/lib/profiler/ProfilerChartTest.java
@@ -29,12 +29,14 @@
 import com.google.devtools.build.lib.profiler.chart.ChartVisitor;
 import com.google.devtools.build.lib.profiler.chart.Color;
 import com.google.devtools.build.lib.profiler.chart.DetailedChartCreator;
+import com.google.devtools.build.lib.profiler.chart.HtmlChartVisitor;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.testutil.Suite;
 import com.google.devtools.build.lib.testutil.TestSpec;
 import com.google.devtools.build.lib.vfs.Path;
 import java.util.List;
+import java.util.Locale;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -230,6 +232,18 @@
     assertThat(visitor.lineCount).isEqualTo(0);
   }
 
+  @Test
+  public void testHtmlChartVisitorFormatColor() {
+    Locale defaultLocale = Locale.getDefault();
+
+    Locale.setDefault(Locale.GERMANY);
+    String black = HtmlChartVisitor.formatColor(Color.GRAY);
+    String[] grayComponents = black.split(",");
+    assertThat(grayComponents.length).isEqualTo(4);
+
+    Locale.setDefault(defaultLocale);
+  }
+
   private ProfileInfo createProfileInfo(Runnable runnable, int noOfRows) throws Exception {
     Scratch scratch = new Scratch();
     Path cacheDir = scratch.dir("/tmp");