Cap formatBytesShort at four characters by rolling the mantissa up to the next unit once it reaches 1000, and give .sbx-speed-label a fixed min-width so the panel widget no longer shifts horizontally as speed values change. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
48 lines
1.4 KiB
JavaScript
48 lines
1.4 KiB
JavaScript
// Formatting helpers for byte counts and transfer rates.
|
|
|
|
const UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
|
|
const SHORT_UNITS = ['', 'K', 'M', 'G', 'T', 'P'];
|
|
|
|
function scale(n) {
|
|
n = Number(n) || 0;
|
|
let i = 0;
|
|
while (n >= 1024 && i < UNITS.length - 1) {
|
|
n /= 1024;
|
|
i += 1;
|
|
}
|
|
return [n, i];
|
|
}
|
|
|
|
// "2.4 MB", human readable with a space.
|
|
export function formatBytes(n) {
|
|
const [v, i] = scale(n);
|
|
const digits = i === 0 ? 0 : v < 10 ? 2 : v < 100 ? 1 : 0;
|
|
return `${v.toFixed(digits)} ${UNITS[i]}`;
|
|
}
|
|
|
|
// Compact for the panel: "2.4M", "120K", "0".
|
|
// Keeps the mantissa under three integer digits so a value is at most four
|
|
// characters wide ("999K", "9.9M", "1023") — the panel field has a fixed width
|
|
// and must never overflow it (see .sbx-speed-label in stylesheet.css).
|
|
export function formatBytesShort(n) {
|
|
let [v, i] = scale(n);
|
|
if (i > 0 && v >= 1000 && i < SHORT_UNITS.length - 1) {
|
|
v /= 1024;
|
|
i += 1;
|
|
}
|
|
if (i === 0)
|
|
return `${Math.round(v)}`;
|
|
const digits = v < 10 ? 1 : 0;
|
|
return `${v.toFixed(digits)}${SHORT_UNITS[i]}`;
|
|
}
|
|
|
|
// "2.4 MB/s" for the menu.
|
|
export function formatSpeed(bytesPerSec) {
|
|
return `${formatBytes(bytesPerSec)}/s`;
|
|
}
|
|
|
|
// "2.4M" for the panel (no /s, arrow provides context).
|
|
export function formatSpeedShort(bytesPerSec) {
|
|
return formatBytesShort(bytesPerSec);
|
|
}
|