23 lines
703 B
TypeScript
23 lines
703 B
TypeScript
const SI_THRESHOLDS = [
|
|
{ limit: 1_000_000_000, divisor: 1_000_000_000, suffix: 'G' },
|
|
{ limit: 1_000_000, divisor: 1_000_000, suffix: 'M' },
|
|
{ limit: 1_000, divisor: 1_000, suffix: 'K' },
|
|
] as const;
|
|
|
|
export function formatSI(v: number, locale?: string): string {
|
|
const abs = Math.abs(v);
|
|
for (const { limit, divisor, suffix } of SI_THRESHOLDS) {
|
|
if (abs >= limit) {
|
|
const formatted = new Intl.NumberFormat(locale, {
|
|
maximumFractionDigits: 3,
|
|
minimumFractionDigits: 0,
|
|
}).format(v / divisor);
|
|
return `${formatted}${suffix}`;
|
|
}
|
|
}
|
|
return new Intl.NumberFormat(locale, {
|
|
maximumFractionDigits: 0,
|
|
minimumFractionDigits: 0,
|
|
}).format(v);
|
|
}
|