数据工具函数
2024年9月11日大约 2 分钟
格式化字节数
/**
* 格式化字节数为易读的字符串
*
* @param bytes 要格式化的字节数
* @param decimals 小数点后的位数,默认为 2
* @returns 格式化后的字符串
*/
function formatBytes(bytes: number, decimals = 2): string {
// 如果字节数为 0,则直接返回 "0 Bytes"
if (bytes === 0) return "0 Bytes";
// 常量 k 用于计算,表示 1024
const k = 1024;
// 确保 decimals 不为负数,如果是,则将其设置为 0
const dm = decimals < 0 ? 0 : decimals;
// 定义了一个字符串数组,用于表示不同的数据大小单位
const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB"] as const;
// 计算单位
const i = Math.floor(Math.log(bytes) / Math.log(k));
// 返回格式化后的字符串,其中使用了 toFixed 方法来保留指定的小数位数
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
}
根据单位转换数据
/**
* 将字节数据从一种单位转换为另一种单位
* @param value 数值
* @param fromUnit 原始单位,可选值为 'B' | 'KB' | 'MB' | 'GB' | 'TB' | 'PB'
* @param toUnit 目标单位,可选值为 'B' | 'KB' | 'MB' | 'GB' | 'TB' | 'PB'
* @param decimals 保留的小数位数,默认为 0
* @returns 转换后的数值
*/
function convertDataWithUnit(
value: number,
fromUnit: "B" | "KB" | "MB" | "GB" | "TB" | "PB",
toUnit: "B" | "KB" | "MB" | "GB" | "TB" | "PB",
decimals = 0
): number {
// 基础单位字节数
const BASE = 1024;
// 单位枚举
enum Unit {
B = Math.pow(BASE, 0),
KB = Math.pow(BASE, 1),
MB = Math.pow(BASE, 2),
GB = Math.pow(BASE, 3),
TB = Math.pow(BASE, 4),
PB = Math.pow(BASE, 5),
}
// 将数据转换为字节数
const bytes = value * Unit[fromUnit.toUpperCase()];
// 将字节数格式化为指定单位的数据
const result = bytes / Unit[toUnit.toUpperCase()];
// 确保 decimals 不为负数,如果是,则将其设置为 0
const dm = decimals < 0 ? 0 : decimals;
// 返回格式化后的数据
return parseFloat(result.toFixed(dm));
}