From f3cc86ef2577a29064a639f2e51a05918b00ba15 Mon Sep 17 00:00:00 2001
From: Tom Robinson <tlrobinson@gmail.com>
Date: Tue, 26 Jul 2016 18:13:19 -0700
Subject: [PATCH] Scalar settings

---
 .../metabase/lib/visualization_settings.js    | 11 +++---
 frontend/src/metabase/vendor.js               |  2 ++
 .../src/metabase/visualizations/Scalar.jsx    | 35 ++++++++++++++-----
 npm-shrinkwrap.json                           |  3 ++
 package.json                                  |  1 +
 5 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/frontend/src/metabase/lib/visualization_settings.js b/frontend/src/metabase/lib/visualization_settings.js
index 18114f0954f..4e1525c9901 100644
--- a/frontend/src/metabase/lib/visualization_settings.js
+++ b/frontend/src/metabase/lib/visualization_settings.js
@@ -291,17 +291,18 @@ const SETTINGS = {
         widget: ChartSettingToggle,
         default: true
     },
-    "scalar.separator": {
+    "scalar.locale": {
         title: "Separator",
         widget: ChartSettingSelect,
         props: {
             options: [
-                { name: "None", value: "" },
-                { name: "Comma", value: "," },
-                { name: "Period", value: "." },
+                { name: "123456.78", value: null },
+                { name: "123,456.78", value: "en" },
+                { name: "123 456,78", value: "fr" },
+                { name: "123.456,78", value: "de" }
             ]
         },
-        default: ","
+        default: null
     },
     "scalar.decimals": {
         title: "Number of decimal places",
diff --git a/frontend/src/metabase/vendor.js b/frontend/src/metabase/vendor.js
index 7aa04850978..afbfd93a6fc 100644
--- a/frontend/src/metabase/vendor.js
+++ b/frontend/src/metabase/vendor.js
@@ -25,3 +25,5 @@ import 'ace/snippets/mysql';
 import 'ace/snippets/pgsql';
 import 'ace/snippets/sqlserver';
 import 'ace/snippets/json';
+
+import 'number-to-locale-string';
diff --git a/frontend/src/metabase/visualizations/Scalar.jsx b/frontend/src/metabase/visualizations/Scalar.jsx
index 775b856d7ca..aec5b0d86ae 100644
--- a/frontend/src/metabase/visualizations/Scalar.jsx
+++ b/frontend/src/metabase/visualizations/Scalar.jsx
@@ -100,15 +100,34 @@ export default class Scalar extends Component {
 
         let scalarValue = i.getIn(data, ["rows", 0, 0]);
 
-        const scale =  parseFloat(settings["scalar.scale"]);
-        if (typeof scalarValue === "number" && !isNaN(scale)) {
-            scalarValue *= scale;
-        }
+        try {
+            if (typeof scalarValue === "number") {
+                // scale
+                const scale =  parseFloat(settings["scalar.scale"]);
+                if (!isNaN(scale)) {
+                    scalarValue *= scale;
+                }
+
+                // round
+                let decimals = parseFloat(settings["scalar.decimals"]);
+                if (!isNaN(decimals)) {
+                    scalarValue = Math.round(scalarValue * Math.pow(10, decimals)) / Math.pow(10, decimals);
+                } else {
+                    decimals = undefined;
+                }
 
-        // const decimals = parseFloat(settings["scalar.decimals"]);
-        // if (typeof scalarValue === "number" && !isNaN(decimals)) {
-        //     scalarValue = Math.round(scalarValue * Math.pow(10, decimals)) / Math.pow(10, decimals);
-        // }
+                // format with separators and correct number of decimals
+                const locale = settings["scalar.locale"];
+                if (locale) {
+                    scalarValue = scalarValue.toLocaleString(locale, { minimumFractionDigits: decimals });
+                } else {
+                    // HACK: no locales that don't thousands separators?
+                    scalarValue = scalarValue.toLocaleString("en", { minimumFractionDigits: decimals }).replace(/,/g, "");
+                }
+            }
+        } catch (e) {
+            console.warn("error formatting scalar", e);
+        }
 
         let compactScalarValue = scalarValue == undefined ? "" :
             formatValue(scalarValue, { column: i.getIn(data, ["cols", 0]), compact: isSmall });
diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json
index 3d6a6adc437..05b5ec7330c 100644
--- a/npm-shrinkwrap.json
+++ b/npm-shrinkwrap.json
@@ -10277,6 +10277,9 @@
         }
       }
     },
+    "number-to-locale-string": {
+      "version": "1.0.1"
+    },
     "password-generator": {
       "version": "2.0.2",
       "dependencies": {
diff --git a/package.json b/package.json
index 7e4c03ea95a..9efe1f4b210 100644
--- a/package.json
+++ b/package.json
@@ -33,6 +33,7 @@
     "moment": "^2.12.0",
     "node-libs-browser": "^0.5.3",
     "normalizr": "^2.0.0",
+    "number-to-locale-string": "^1.0.1",
     "password-generator": "^2.0.1",
     "react": "^15.2.1",
     "react-addons-css-transition-group": "^15.2.1",
-- 
GitLab