136 lines
2.9 KiB
JavaScript
136 lines
2.9 KiB
JavaScript
(function (root, factory) {
|
|
if (typeof define === 'function' && define.amd) {
|
|
define([], factory);
|
|
} else if (typeof module === 'object' && module.exports) {
|
|
module.exports = factory();
|
|
} else {
|
|
root.UFormat = factory();
|
|
}
|
|
}(typeof self !== 'undefined' ? self : this, function () {
|
|
'use strict';
|
|
|
|
const BYTE_UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
|
|
|
|
function scaleBytes(bytes) {
|
|
let value = Number(bytes || 0);
|
|
let unitIndex = 0;
|
|
while (Math.abs(value) >= 1024 && unitIndex < BYTE_UNITS.length - 1) {
|
|
value /= 1024;
|
|
unitIndex += 1;
|
|
}
|
|
return { value, unitIndex };
|
|
}
|
|
|
|
function formatBytes(bytes) {
|
|
if (bytes == null || bytes === '') return '--';
|
|
const scaled = scaleBytes(bytes);
|
|
const decimals = scaled.unitIndex === 0 ? 0 : 1;
|
|
return `${scaled.value.toFixed(decimals)} ${BYTE_UNITS[scaled.unitIndex]}`;
|
|
}
|
|
|
|
function formatDiskBytes(bytes) {
|
|
if (bytes == null || bytes === '') return '--';
|
|
const scaled = scaleBytes(bytes);
|
|
const decimals = scaled.unitIndex >= 4 ? 2 : scaled.unitIndex >= 1 ? 1 : 0;
|
|
return `${scaled.value.toFixed(decimals)} ${BYTE_UNITS[scaled.unitIndex]}`;
|
|
}
|
|
|
|
function formatCount(value) {
|
|
const number = Number(value);
|
|
if (!Number.isFinite(number)) return '--';
|
|
return number.toLocaleString();
|
|
}
|
|
|
|
function formatDurationMs(value) {
|
|
const number = Number(value);
|
|
if (!Number.isFinite(number)) return '--';
|
|
if (Math.abs(number) >= 1000) {
|
|
return `${(number / 1000).toFixed(number >= 10000 ? 0 : 1)} s`;
|
|
}
|
|
return `${number.toFixed(number >= 100 ? 0 : 1)} ms`;
|
|
}
|
|
|
|
function parseUnitNumber(text) {
|
|
const normalized = String(text || '').trim().toLowerCase().replace(/,/g, '');
|
|
if (!normalized) return null;
|
|
|
|
const pure = normalized.match(/^([-+]?\d*\.?\d+)$/);
|
|
if (pure) {
|
|
return Number(pure[1]);
|
|
}
|
|
|
|
const withUnit = normalized.match(/^([-+]?\d*\.?\d+)\s*([a-z%][a-z0-9\/_-]*)$/);
|
|
if (!withUnit) {
|
|
return null;
|
|
}
|
|
|
|
const value = Number(withUnit[1]);
|
|
let unit = withUnit[2];
|
|
if (!Number.isFinite(value)) {
|
|
return null;
|
|
}
|
|
|
|
if (unit.endsWith('/s')) {
|
|
unit = unit.slice(0, -2);
|
|
}
|
|
|
|
const bytes = {
|
|
b: 1,
|
|
kb: 1024,
|
|
kib: 1024,
|
|
mb: 1024 ** 2,
|
|
mib: 1024 ** 2,
|
|
gb: 1024 ** 3,
|
|
gib: 1024 ** 3,
|
|
tb: 1024 ** 4,
|
|
tib: 1024 ** 4,
|
|
pb: 1024 ** 5,
|
|
pib: 1024 ** 5,
|
|
};
|
|
|
|
if (Object.prototype.hasOwnProperty.call(bytes, unit)) {
|
|
return value * bytes[unit];
|
|
}
|
|
|
|
const durations = {
|
|
ms: 0.001,
|
|
s: 1,
|
|
sec: 1,
|
|
secs: 1,
|
|
second: 1,
|
|
seconds: 1,
|
|
m: 60,
|
|
min: 60,
|
|
mins: 60,
|
|
minute: 60,
|
|
minutes: 60,
|
|
h: 3600,
|
|
hr: 3600,
|
|
hrs: 3600,
|
|
hour: 3600,
|
|
hours: 3600,
|
|
d: 86400,
|
|
day: 86400,
|
|
days: 86400,
|
|
};
|
|
|
|
if (Object.prototype.hasOwnProperty.call(durations, unit)) {
|
|
return value * durations[unit];
|
|
}
|
|
|
|
if (unit === '%') {
|
|
return value;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
return {
|
|
formatBytes,
|
|
formatCount,
|
|
formatDiskBytes,
|
|
formatDurationMs,
|
|
parseUnitNumber,
|
|
scaleBytes,
|
|
};
|
|
})); |