diff options
author | Timothy Flynn <trflynn89@pm.me> | 2021-11-15 13:58:00 -0500 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2021-11-16 00:56:55 +0000 |
commit | 99c15741ba38c92dbf7265b9d8411f9f8185502e (patch) | |
tree | d12f37ca11470dbdb35629ca6c8f112b2d4182dc /Userland/Libraries | |
parent | 14aca0316130abc0b7b1b9ac2ed5ddcdbc8ae7e1 (diff) | |
download | serenity-99c15741ba38c92dbf7265b9d8411f9f8185502e.zip |
LibJS: Conditionally ignore [[UseGrouping]] in compact notation
Diffstat (limited to 'Userland/Libraries')
-rw-r--r-- | Userland/Libraries/LibJS/Runtime/Intl/NumberFormat.cpp | 18 | ||||
-rw-r--r-- | Userland/Libraries/LibJS/Tests/builtins/Intl/NumberFormat/NumberFormat.prototype.format.js | 52 |
2 files changed, 69 insertions, 1 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/Intl/NumberFormat.cpp b/Userland/Libraries/LibJS/Runtime/Intl/NumberFormat.cpp index db7d2f715f..f8292fe6f7 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/NumberFormat.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/NumberFormat.cpp @@ -902,8 +902,24 @@ Vector<PatternPartition> partition_notation_sub_pattern(NumberFormat& number_for // b. Let fraction be undefined. } + bool use_grouping = number_format.use_grouping(); + + // FIXME: The spec doesn't indicate this, but grouping should be disabled for numbers less than 10,000 when the notation is compact. + // This is addressed in Intl.NumberFormat V3 with the "min2" [[UseGrouping]] option. However, test262 explicitly expects this + // behavior in the "de-DE" locale tests, because this is how ICU (and therefore V8, SpiderMoney, etc.) has always behaved. + // + // So, in locales "de-*", we must have: + // Intl.NumberFormat("de", {notation: "compact"}).format(1234) === "1234" + // Intl.NumberFormat("de", {notation: "compact"}).format(12345) === "12.345" + // Intl.NumberFormat("de").format(1234) === "1.234" + // Intl.NumberFormat("de").format(12345) === "12.345" + // + // See: https://github.com/tc39/proposal-intl-numberformat-v3/issues/3 + if (number_format.has_compact_format()) + use_grouping = number >= 10'000; + // 6. If the numberFormat.[[UseGrouping]] is true, then - if (number_format.use_grouping()) { + if (use_grouping) { // a. Let groupSepSymbol be the implementation-, locale-, and numbering system-dependent (ILND) String representing the grouping separator. auto group_sep_symbol = Unicode::get_number_system_symbol(number_format.data_locale(), number_format.numbering_system(), "group"sv).value_or(","sv); diff --git a/Userland/Libraries/LibJS/Tests/builtins/Intl/NumberFormat/NumberFormat.prototype.format.js b/Userland/Libraries/LibJS/Tests/builtins/Intl/NumberFormat/NumberFormat.prototype.format.js index 54381e9f83..cc580da8ab 100644 --- a/Userland/Libraries/LibJS/Tests/builtins/Intl/NumberFormat/NumberFormat.prototype.format.js +++ b/Userland/Libraries/LibJS/Tests/builtins/Intl/NumberFormat/NumberFormat.prototype.format.js @@ -227,6 +227,32 @@ describe("style=decimal", () => { expect(ar.format(1290000)).toBe("\u0661\u066b\u0663 مليون"); expect(ar.format(12000000)).toBe("\u0661\u0662 مليون"); expect(ar.format(12900000)).toBe("\u0661\u0663 مليون"); + + const ja = new Intl.NumberFormat("ja", { notation: "compact", compactDisplay: "long" }); + expect(ja.format(1)).toBe("1"); + expect(ja.format(1200)).toBe("1200"); + expect(ja.format(1290)).toBe("1290"); + expect(ja.format(12000)).toBe("1.2万"); + expect(ja.format(12900)).toBe("1.3万"); + expect(ja.format(1200000)).toBe("120万"); + expect(ja.format(1290000)).toBe("129万"); + expect(ja.format(12000000)).toBe("1200万"); + expect(ja.format(12900000)).toBe("1290万"); + expect(ja.format(120000000)).toBe("1.2億"); + expect(ja.format(129000000)).toBe("1.3億"); + expect(ja.format(12000000000)).toBe("120億"); + expect(ja.format(12900000000)).toBe("129億"); + + const de = new Intl.NumberFormat("de", { notation: "compact", compactDisplay: "long" }); + expect(de.format(1)).toBe("1"); + expect(de.format(1200)).toBe("1,2 Tausend"); + expect(de.format(1290)).toBe("1,3 Tausend"); + expect(de.format(12000)).toBe("12 Tausend"); + expect(de.format(12900)).toBe("13 Tausend"); + expect(de.format(1200000)).toBe("1,2 Millionen"); + expect(de.format(1290000)).toBe("1,3 Millionen"); + expect(de.format(12000000)).toBe("12 Millionen"); + expect(de.format(12900000)).toBe("13 Millionen"); }); test("notation=compact, compactDisplay=short", () => { @@ -251,6 +277,32 @@ describe("style=decimal", () => { expect(ar.format(1290000)).toBe("\u0661\u066b\u0663\u00a0مليون"); expect(ar.format(12000000)).toBe("\u0661\u0662\u00a0مليون"); expect(ar.format(12900000)).toBe("\u0661\u0663\u00a0مليون"); + + const ja = new Intl.NumberFormat("ja", { notation: "compact", compactDisplay: "short" }); + expect(ja.format(1)).toBe("1"); + expect(ja.format(1200)).toBe("1200"); + expect(ja.format(1290)).toBe("1290"); + expect(ja.format(12000)).toBe("1.2万"); + expect(ja.format(12900)).toBe("1.3万"); + expect(ja.format(1200000)).toBe("120万"); + expect(ja.format(1290000)).toBe("129万"); + expect(ja.format(12000000)).toBe("1200万"); + expect(ja.format(12900000)).toBe("1290万"); + expect(ja.format(120000000)).toBe("1.2億"); + expect(ja.format(129000000)).toBe("1.3億"); + expect(ja.format(12000000000)).toBe("120億"); + expect(ja.format(12900000000)).toBe("129億"); + + const de = new Intl.NumberFormat("de", { notation: "compact", compactDisplay: "short" }); + expect(de.format(1)).toBe("1"); + expect(de.format(1200)).toBe("1200"); + expect(de.format(1290)).toBe("1290"); + expect(de.format(12000)).toBe("12.000"); + expect(de.format(12900)).toBe("12.900"); + expect(de.format(1200000)).toBe("1,2\u00a0Mio."); + expect(de.format(1290000)).toBe("1,3\u00a0Mio."); + expect(de.format(12000000)).toBe("12\u00a0Mio."); + expect(de.format(12900000)).toBe("13\u00a0Mio."); }); test("signDisplay=never", () => { |