87 lines
2.9 KiB
TypeScript
87 lines
2.9 KiB
TypeScript
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,
|
|
};
|