import numeral from "numeral"; import { formatCurrency, formatNumber, formatPercent } from "~/locale/format"; export const defaultCurrencySymbol = "$"; export const defaultCurrency = "USD"; const legacyNumberLocale = "en-US"; export type NumberFormatType = "integer" | "decimal" | "currency" | "percentage" | "rating"; export const NumberFormats: { name: string; value: NumberFormatType; labelKey: string }[] = [ { name: "Integer", value: "integer", labelKey: "formats.number.integer" }, { name: "Decimal", value: "decimal", labelKey: "formats.number.decimal" }, { name: "Currency", value: "currency", labelKey: "formats.number.currency" }, { name: "Percent", value: "percentage", labelKey: "formats.number.percent" }, { name: "Rating", value: "rating", labelKey: "formats.number.rating" }, ]; const numberFormat = (value: number): string => { try { return formatNumber(value, legacyNumberLocale, { maximumFractionDigits: 0 }); } catch (e) { return value?.toString(); } }; const decimalFormat = (value: number, decimalPlaces: number = 2): string => { try { return formatNumber(value, legacyNumberLocale, { minimumFractionDigits: decimalPlaces, maximumFractionDigits: decimalPlaces, }); } catch (e) { return value?.toString(); } }; const intFormat = (value: number | string): string => { try { return formatNumber(Number(value), legacyNumberLocale, { maximumFractionDigits: 0 }); } catch (e) { return value?.toString(); } }; const currencyFormat = (value: number, currency: string = defaultCurrency, decimalPlaces: number = 2, locale: string = legacyNumberLocale): string => { try { return formatCurrency(value, currency.toUpperCase(), locale, { minimumFractionDigits: decimalPlaces, maximumFractionDigits: decimalPlaces, }); } catch (e) { return `${defaultCurrencySymbol}${decimalFormat(value, decimalPlaces)}`; } }; const currencyFromCents = (cents: number, currency: string = defaultCurrency, decimalPlaces: number = 2, locale: string = legacyNumberLocale): string => { return currencyFormat(cents / 100, currency, decimalPlaces, locale); }; const percentFormat = (value: number, decimalPlaces: number = 2, locale: string = legacyNumberLocale): string => { try { return formatPercent(value / 100, locale, { minimumFractionDigits: decimalPlaces, maximumFractionDigits: decimalPlaces, }); } catch (e) { return `${decimalFormat(value, decimalPlaces)}%`; } }; const pad = (num: number, size: number) => { const s = "000000000" + num; return s.substring(s.length - size); }; const custom = (value: number, format: string): string => { try { return numeral(value).format(format); } catch (e) { return value?.toString(); } }; export default { numberFormat, decimalFormat, intFormat, currencyFormat, currencyFromCents, percentFormat, pad, defaultCurrencySymbol, defaultCurrency, custom, };