diff --git a/frontend/src/metabase/lib/formatting.js b/frontend/src/metabase/lib/formatting.js index bd542a9793e2c6c9a2e826d58e427227890c8036..fa8baeedc6de2c01fd31bf2cf5d55282a104e914 100644 --- a/frontend/src/metabase/lib/formatting.js +++ b/frontend/src/metabase/lib/formatting.js @@ -156,7 +156,7 @@ export function formatNumber(number: number, options: FormattingOptions = {}) { } if (options.compact) { - return formatNumberCompact(number); + return formatNumberCompact(number, options); } else if (options.number_style === "scientific") { return formatNumberScientific(number, options); } else { @@ -248,7 +248,14 @@ function formatNumberScientific( } } -function formatNumberCompact(value: number) { +function formatNumberCompact(value: number, options: FormattingOptions) { + if (options.number_style === "percent") { + return formatNumberCompactWithoutOptions(value * 100) + "%"; + } + return formatNumberCompactWithoutOptions(value); +} + +function formatNumberCompactWithoutOptions(value: number) { if (value === 0) { // 0 => 0 return "0"; diff --git a/frontend/test/metabase/lib/formatting.unit.spec.js b/frontend/test/metabase/lib/formatting.unit.spec.js index 6b9fc93ab3c60b1f1a790ebe83b5eabc8c5389bd..e93bbdf5843b76c73acc519141738dbc9d322b98 100644 --- a/frontend/test/metabase/lib/formatting.unit.spec.js +++ b/frontend/test/metabase/lib/formatting.unit.spec.js @@ -46,6 +46,19 @@ describe("formatting", () => { expect(formatNumber(1000, { compact: true })).toEqual("1.0k"); expect(formatNumber(1111, { compact: true })).toEqual("1.1k"); }); + it("should format compact percentages", () => { + const options = { compact: true, number_style: "percent" }; + expect(formatNumber(0, options)).toEqual("0%"); + expect(formatNumber(0.001, options)).toEqual("0.1%"); + expect(formatNumber(0.0001, options)).toEqual("~ 0%"); + expect(formatNumber(0.001234, options)).toEqual("0.12%"); + expect(formatNumber(0.1, options)).toEqual("10%"); + expect(formatNumber(0.1234, options)).toEqual("12%"); + expect(formatNumber(0.019, options)).toEqual("2%"); + expect(formatNumber(0.021, options)).toEqual("2%"); + expect(formatNumber(11.11, options)).toEqual("1.1k%"); + expect(formatNumber(-0.22, options)).toEqual("-22%"); + }); }); // FIXME: failing on CI xit("should format to correct number of decimal places", () => {