Files
HiveGrid-Wireframes/hivegrid-cloud/apps/web/app/utils/shared/NumberUtils.ts
T

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,
};