You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
31 lines
743 B
31 lines
743 B
interface PluralForms {
|
|
one: string;
|
|
other: string;
|
|
[key: string]: string;
|
|
}
|
|
|
|
interface FormatOptions {
|
|
locale?: string;
|
|
pluralRules?: Intl.PluralRulesOptions;
|
|
numberFormat?: Intl.NumberFormatOptions;
|
|
}
|
|
|
|
export function formatQuantity(
|
|
value: number,
|
|
forms: PluralForms,
|
|
options: FormatOptions = {},
|
|
) {
|
|
const {
|
|
locale = "en-US",
|
|
pluralRules: pluralOptions = { type: "cardinal" },
|
|
numberFormat: numberOptions = {},
|
|
} = options;
|
|
|
|
const pluralRules = new Intl.PluralRules(locale, pluralOptions);
|
|
const numberFormat = new Intl.NumberFormat(locale, numberOptions);
|
|
|
|
const pluralCategory = pluralRules.select(value);
|
|
const word = forms[pluralCategory];
|
|
|
|
return `${numberFormat.format(value)} ${word}`;
|
|
}
|
|
|