Import source: web/src/lib/format
Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality.
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
import { localeOf, type Lang } from "./i18n";
|
||||
|
||||
const DUR_UNITS: Record<Lang, { s: string; m: string; h: string; d: string }> = {
|
||||
en: { s: "s", m: "m", h: "h", d: "d" },
|
||||
fa: { s: "ث", m: "د", h: "س", d: "ر" },
|
||||
};
|
||||
|
||||
export const pctSign = (lang: Lang) => (lang === "fa" ? "٪" : "%");
|
||||
|
||||
export function fmtNumber(lang: Lang, value: number, digits = 0): string {
|
||||
return new Intl.NumberFormat(localeOf(lang), {
|
||||
minimumFractionDigits: digits,
|
||||
maximumFractionDigits: digits,
|
||||
}).format(value);
|
||||
}
|
||||
|
||||
/** Uptime percent: "99.98" — trims to the precision that matters. */
|
||||
export function fmtUptime(lang: Lang, pct: number): string {
|
||||
const digits = pct >= 100 ? 0 : pct >= 99 ? 2 : 1;
|
||||
return fmtNumber(lang, pct, digits);
|
||||
}
|
||||
|
||||
export function fmtLatency(lang: Lang, ms: number): string {
|
||||
if (ms >= 1000) return `${fmtNumber(lang, ms / 1000, 2)}s`;
|
||||
if (ms >= 100) return `${fmtNumber(lang, ms, 0)}ms`;
|
||||
return `${fmtNumber(lang, ms, 1)}ms`;
|
||||
}
|
||||
|
||||
export function fmtClock(lang: Lang, date: Date): string {
|
||||
return new Intl.DateTimeFormat(localeOf(lang), {
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
hour12: false,
|
||||
}).format(date);
|
||||
}
|
||||
|
||||
export function fmtTime(lang: Lang, ts: number): string {
|
||||
return new Intl.DateTimeFormat(localeOf(lang), {
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
hour12: false,
|
||||
}).format(new Date(ts));
|
||||
}
|
||||
|
||||
export function fmtDate(lang: Lang, ts: number): string {
|
||||
return new Intl.DateTimeFormat(localeOf(lang), {
|
||||
month: "short",
|
||||
day: "numeric",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
hour12: false,
|
||||
}).format(new Date(ts));
|
||||
}
|
||||
|
||||
export function fmtHour(lang: Lang, hour: number): string {
|
||||
return fmtNumber(lang, hour);
|
||||
}
|
||||
|
||||
/** "3m 20s" style duration, localized digits and units. */
|
||||
export function fmtDuration(lang: Lang, ms: number): string {
|
||||
const u = DUR_UNITS[lang];
|
||||
const s = Math.max(0, Math.round(ms / 1000));
|
||||
if (s < 60) return `${fmtNumber(lang, s)}${u.s}`;
|
||||
const m = Math.floor(s / 60);
|
||||
if (m < 60) return `${fmtNumber(lang, m)}${u.m} ${fmtNumber(lang, s % 60)}${u.s}`;
|
||||
const h = Math.floor(m / 60);
|
||||
if (h < 24) return `${fmtNumber(lang, h)}${u.h} ${fmtNumber(lang, m % 60)}${u.m}`;
|
||||
const d = Math.floor(h / 24);
|
||||
return `${fmtNumber(lang, d)}${u.d} ${fmtNumber(lang, h % 24)}${u.h}`;
|
||||
}
|
||||
|
||||
/** Seconds → "15s" / "5m" for check intervals. */
|
||||
export function fmtInterval(lang: Lang, sec: number): string {
|
||||
if (sec < 60) return `${fmtNumber(lang, sec)}s`;
|
||||
if (sec < 3600) return `${fmtNumber(lang, Math.round(sec / 60))}m`;
|
||||
return `${fmtNumber(lang, Math.round(sec / 3600))}h`;
|
||||
}
|
||||
Reference in New Issue
Block a user