Files
ray/dashboard/client/src/common/formatUtils.ts
T

60 lines
1.9 KiB
TypeScript

export const formatByteAmount = (
amount: number,
unit: "mebibyte" | "gibibyte",
) =>
`${(
amount / (unit === "mebibyte" ? Math.pow(1024, 2) : Math.pow(1024, 3))
).toFixed(1)} ${unit === "mebibyte" ? "MiB" : "GiB"}`;
export const formatUsage = (
used_b: number,
total_b: number,
unit: "mebibyte" | "gibibyte",
includePercentage: boolean,
) => {
const usedFormatted = formatByteAmount(used_b, unit);
const totalFormatted = formatByteAmount(total_b, unit);
const percent = (100 * used_b) / total_b;
const ratioStr = `${usedFormatted} / ${totalFormatted}`;
if (includePercentage) {
return `${ratioStr} (${percent.toFixed(0)}%)`;
}
return ratioStr;
};
// Formats, e.g. 400 and 6000 as "400 MiB / 6000 MiB (6.7%)"
export const MiBRatio = (used: number, total: number) =>
`${used} MiB / ${total} MiB (${(100 * (used / total)).toFixed(1)}%)`;
export const MiBRatioNoPercent = (used: number, total: number) =>
`${used} MiB / ${total} MiB`;
export const formatDuration = (durationInSeconds: number) => {
const durationSeconds = Math.floor(durationInSeconds) % 60;
const durationMinutes = Math.floor(durationInSeconds / 60) % 60;
const durationHours = Math.floor(durationInSeconds / 60 / 60) % 24;
const durationDays = Math.floor(durationInSeconds / 60 / 60 / 24);
const pad = (value: number) => value.toString().padStart(2, "0");
return [
durationDays ? `${durationDays}d` : "",
`${pad(durationHours)}h`,
`${pad(durationMinutes)}m`,
`${pad(durationSeconds)}s`,
].join(" ");
};
export const formatValue = (rawFloat: number) => {
try {
const decimals = rawFloat.toString().split(".")[1].length || 0;
if (decimals <= 3) {
return rawFloat.toString();
} // Few decimals
if (Math.abs(rawFloat.valueOf()) >= 1.0) {
return rawFloat.toPrecision(5);
} // Values >= 1
return rawFloat.toExponential(); // Values in (-1; 1)
} catch (e) {
return rawFloat.toString();
}
};