Ordinal Number Formatting

Turn integers into 1st, 2nd, 3rd and 11th using Intl.PluralRules ordinal categories with a safe fallback.

JavascriptData Integrity

Code

snippet
const EN_ORDINAL_SUFFIX = { one: "st", two: "nd", few: "rd", other: "th" };

export function formatOrdinal(value, locale = "en") {
  if (!Number.isInteger(value)) throw new TypeError("value must be an integer");
  const rules = new Intl.PluralRules(locale, { type: "ordinal" });
  const suffix = locale.toLowerCase().startsWith("en")
    ? EN_ORDINAL_SUFFIX[rules.select(Math.abs(value))]
    : "";
  return suffix
    ? String(value) + suffix
    : new Intl.NumberFormat(locale).format(value);
}

export function formatOrdinalList(values, locale = "en") {
  if (!Array.isArray(values)) throw new TypeError("values must be an array");
  return values.map((value) => formatOrdinal(value, locale));
}