open-nomad/ui/app/utils/units.js
2023-04-10 15:36:59 +00:00

80 lines
2.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: MPL-2.0
*/
export const BYTES_UNITS = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'];
export const HERTZ_UNITS = ['Hz', 'KHz', 'MHz', 'GHz', 'THz', 'PHz'];
const locale = window.navigator.locale || 'en';
const decimalFormatter = new Intl.NumberFormat(locale, {
maximumFractionDigits: 2,
});
const roundFormatter = new Intl.NumberFormat(locale, {
maximumFractionDigits: 0,
});
const unitReducer = (number = 0, interval, units, maxUnit, startingUnit) => {
if (startingUnit && units.indexOf(startingUnit) !== -1) {
units = units.slice(units.indexOf(startingUnit));
}
if (maxUnit && units.indexOf(maxUnit) !== -1) {
units = units.slice(0, units.indexOf(maxUnit) + 1);
}
// Reduce negative numbers by temporarily flipping them positive.
const negative = number < 0;
if (negative) {
number *= -1;
}
let unitIndex = 0;
while (number >= interval && unitIndex < units.length - 1) {
number /= interval;
unitIndex++;
}
if (negative) {
number *= -1;
}
return [number, units[unitIndex]];
};
export function reduceBytes(bytes = 0, maxUnitSize, startingUnitSize) {
return unitReducer(bytes, 1024, BYTES_UNITS, maxUnitSize, startingUnitSize);
}
export function reduceHertz(hertz = 0, maxUnitSize, startingUnitSize) {
return unitReducer(hertz, 1000, HERTZ_UNITS, maxUnitSize, startingUnitSize);
}
// General purpose formatters meant to reduce units as much
// as possible.
export function formatBytes(bytes, startingUnitSize) {
const [number, unit] = reduceBytes(bytes, null, startingUnitSize);
return `${decimalFormatter.format(number)} ${unit}`;
}
export function formatHertz(hertz, startingUnitSize) {
const [number, unit] = reduceHertz(hertz, null, startingUnitSize);
return `${decimalFormatter.format(number)} ${unit}`;
}
// Specialized formatters meant to reduce units to the resolution
// the scheduler and job specs operate at.
export function formatScheduledBytes(bytes, startingUnitSize) {
const [number, unit] = reduceBytes(bytes, 'MiB', startingUnitSize);
return `${roundFormatter.format(number)} ${unit}`;
}
export function formatScheduledHertz(hertz, startingUnitSize) {
const [number, unit] = reduceHertz(hertz, 'MHz', startingUnitSize);
return `${roundFormatter.format(number)} ${unit}`;
}
// Replaces the minus sign () with a hyphen (-).
// https://github.com/d3/d3-format/releases/tag/v2.0.0
export function replaceMinus(input) {
return input.replace('', '-');
}