1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 08:27:46 +00:00

LibJS: Implement number grouping for Intl.NumberFormat

For example, in en-US, the number 123456 should be formatted as the
string "123,456". In en-IN, it should be formatted as "1,23,456".
This commit is contained in:
Timothy Flynn 2021-11-13 23:59:12 -05:00 committed by Linus Groh
parent 3b7f5af042
commit 15c5fbd9e9
3 changed files with 171 additions and 12 deletions

View file

@ -204,6 +204,52 @@ describe("style=decimal", () => {
expect(ar.format(-0)).toBe("\u0660");
expect(ar.format(-1)).toBe("\u061c-\u0661");
});
test("useGrouping=true", () => {
const en = new Intl.NumberFormat("en", { useGrouping: true });
expect(en.format(123)).toBe("123");
expect(en.format(1234)).toBe("1,234");
expect(en.format(12345)).toBe("12,345");
expect(en.format(123456)).toBe("123,456");
expect(en.format(1234567)).toBe("1,234,567");
const enIn = new Intl.NumberFormat("en-IN", { useGrouping: true });
expect(enIn.format(123)).toBe("123");
expect(enIn.format(1234)).toBe("1,234");
expect(enIn.format(12345)).toBe("12,345");
expect(enIn.format(123456)).toBe("1,23,456");
expect(enIn.format(1234567)).toBe("12,34,567");
const ar = new Intl.NumberFormat("ar", { useGrouping: true });
expect(ar.format(123)).toBe("\u0661\u0662\u0663");
expect(ar.format(1234)).toBe("\u0661\u066c\u0662\u0663\u0664");
expect(ar.format(12345)).toBe("\u0661\u0662\u066c\u0663\u0664\u0665");
expect(ar.format(123456)).toBe("\u0661\u0662\u0663\u066c\u0664\u0665\u0666");
expect(ar.format(1234567)).toBe("\u0661\u066c\u0662\u0663\u0664\u066c\u0665\u0666\u0667");
});
test("useGrouping=false", () => {
const en = new Intl.NumberFormat("en", { useGrouping: false });
expect(en.format(123)).toBe("123");
expect(en.format(1234)).toBe("1234");
expect(en.format(12345)).toBe("12345");
expect(en.format(123456)).toBe("123456");
expect(en.format(1234567)).toBe("1234567");
const enIn = new Intl.NumberFormat("en-IN", { useGrouping: false });
expect(enIn.format(123)).toBe("123");
expect(enIn.format(1234)).toBe("1234");
expect(enIn.format(12345)).toBe("12345");
expect(enIn.format(123456)).toBe("123456");
expect(enIn.format(1234567)).toBe("1234567");
const ar = new Intl.NumberFormat("ar", { useGrouping: false });
expect(ar.format(123)).toBe("\u0661\u0662\u0663");
expect(ar.format(1234)).toBe("\u0661\u0662\u0663\u0664");
expect(ar.format(12345)).toBe("\u0661\u0662\u0663\u0664\u0665");
expect(ar.format(123456)).toBe("\u0661\u0662\u0663\u0664\u0665\u0666");
expect(ar.format(1234567)).toBe("\u0661\u0662\u0663\u0664\u0665\u0666\u0667");
});
});
describe("style=percent", () => {

View file

@ -180,6 +180,70 @@ describe("style=decimal", () => {
{ type: "integer", value: "\u0661" },
]);
});
test("useGrouping=true", () => {
const en = new Intl.NumberFormat("en", { useGrouping: true });
expect(en.formatToParts(123456)).toEqual([
{ type: "integer", value: "123" },
{ type: "group", value: "," },
{ type: "integer", value: "456" },
]);
expect(en.formatToParts(1234567)).toEqual([
{ type: "integer", value: "1" },
{ type: "group", value: "," },
{ type: "integer", value: "234" },
{ type: "group", value: "," },
{ type: "integer", value: "567" },
]);
const enIn = new Intl.NumberFormat("en-IN", { useGrouping: true });
expect(enIn.formatToParts(123456)).toEqual([
{ type: "integer", value: "1" },
{ type: "group", value: "," },
{ type: "integer", value: "23" },
{ type: "group", value: "," },
{ type: "integer", value: "456" },
]);
expect(enIn.formatToParts(1234567)).toEqual([
{ type: "integer", value: "12" },
{ type: "group", value: "," },
{ type: "integer", value: "34" },
{ type: "group", value: "," },
{ type: "integer", value: "567" },
]);
const ar = new Intl.NumberFormat("ar", { useGrouping: true });
expect(ar.formatToParts(123456)).toEqual([
{ type: "integer", value: "\u0661\u0662\u0663" },
{ type: "group", value: "\u066c" },
{ type: "integer", value: "\u0664\u0665\u0666" },
]);
expect(ar.formatToParts(1234567)).toEqual([
{ type: "integer", value: "\u0661" },
{ type: "group", value: "\u066c" },
{ type: "integer", value: "\u0662\u0663\u0664" },
{ type: "group", value: "\u066c" },
{ type: "integer", value: "\u0665\u0666\u0667" },
]);
});
test("useGrouping=false", () => {
const en = new Intl.NumberFormat("en", { useGrouping: false });
expect(en.formatToParts(123456)).toEqual([{ type: "integer", value: "123456" }]);
expect(en.formatToParts(1234567)).toEqual([{ type: "integer", value: "1234567" }]);
const enIn = new Intl.NumberFormat("en-IN", { useGrouping: false });
expect(enIn.formatToParts(123456)).toEqual([{ type: "integer", value: "123456" }]);
expect(enIn.formatToParts(1234567)).toEqual([{ type: "integer", value: "1234567" }]);
const ar = new Intl.NumberFormat("ar", { useGrouping: false });
expect(ar.formatToParts(123456)).toEqual([
{ type: "integer", value: "\u0661\u0662\u0663\u0664\u0665\u0666" },
]);
expect(ar.formatToParts(1234567)).toEqual([
{ type: "integer", value: "\u0661\u0662\u0663\u0664\u0665\u0666\u0667" },
]);
});
});
describe("style=percent", () => {