Files
front-pc/utils/utils.ts

142 lines
5.2 KiB
TypeScript
Raw Permalink 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.

import Decimal from 'decimal.js'
/**
* 加法计算
* @param param1 当前值number或string
* @param param2 当前值number或string
* @param num 保留小数位数默认小数2位
* @param mode 舍入模式1 向上取2 向下取3 四舍五入默认3
* @returns 返回处理后的数据
*/
export function accAdd(param1: number | string, param2: number | string, num = 2, mode = 3) {
if (param1 === null || param1 === undefined || param1 === '') return param1
if (param2 === null || param2 === undefined || param2 === '') return param2
const temp = new Decimal(param1).add(new Decimal(param2))
if (mode === 1) return temp.toFixed(num, Decimal.ROUND_UP)
else if (mode === 2) return temp.toFixed(num, Decimal.ROUND_DOWN)
else return temp.toFixed(num, Decimal.ROUND_HALF_UP)
}
/**
* 减法计算
* @param param1 当前值number或string
* @param param2 当前值number或string
* @param num 保留小数位数默认小数2位
* @param mode 舍入模式1 向上取2 向下取3 四舍五入默认3
* @returns 返回处理后的数据
*/
export function accSub(param1: number | string, param2: number | string, num = 2, mode = 3) {
if (param1 === null || param1 === undefined || param1 === '') return param1
if (param2 === null || param2 === undefined || param2 === '') return param2
const temp = new Decimal(param1).sub(new Decimal(param2))
if (mode === 1) return temp.toFixed(num, Decimal.ROUND_UP)
else if (mode === 2) return temp.toFixed(num, Decimal.ROUND_DOWN)
else return temp.toFixed(num, Decimal.ROUND_HALF_UP)
}
/**
* 乘法计算
* @param param1 当前值number或string
* @param param2 当前值number或string
* @param num 保留小数位数默认小数2位
* @param mode 舍入模式1 向上取2 向下取3 四舍五入默认3
* @returns 返回处理后的数据
*/
export function accMul(param1: number | string, param2: number | string, num = 2, mode = 3) {
if (param1 === null || param1 === undefined || param1 === '') return param1
if (param2 === null || param2 === undefined || param2 === '') return param2
const temp = new Decimal(param1).mul(new Decimal(param2))
if (mode === 1) return temp.toFixed(num, Decimal.ROUND_UP)
else if (mode === 2) return temp.toFixed(num, Decimal.ROUND_DOWN)
else return temp.toFixed(num, Decimal.ROUND_HALF_UP)
}
/**
* 除法计算
* @param param1 当前值number或string
* @param param2 当前值number或string
* @param num 保留小数位数默认小数2位
* @param mode 舍入模式1 向上取2 向下取3 四舍五入默认3
* @returns 返回处理后的数据
*/
export function accDiv(param1: number | string, param2: number | string, num = 2, mode = 3) {
if (param1 === null || param1 === undefined || param1 === '') return param1
if (param2 === null || param2 === undefined || param2 === '' || param2.toString() === '0') return param2
const temp = new Decimal(param1).div(new Decimal(param2))
if (mode === 1) return temp.toFixed(num, Decimal.ROUND_UP)
else if (mode === 2) return temp.toFixed(num, Decimal.ROUND_DOWN)
else return temp.toFixed(num, Decimal.ROUND_HALF_UP)
}
/**
* 数字格式化千分位显示
* @param decimals 保留小数位数, 传-1则表示 原数字有小数则保留两位小数,原数字没小数则为整数
* @returns 返回处理后的数据字符串
*/
export const formatNumber = (value?: number, decimals = 0) => {
if (!value) return 0
if (decimals === -1) {
decimals = value % 1 === 0 ? 0 : 2
}
return new Intl.NumberFormat('zh-CN', {
minimumFractionDigits: decimals,
maximumFractionDigits: decimals,
}).format(value)
}
/***
* 下载文件
* @param url 文件地址
* @param filename 文件名
*/
export const downloadFile = async (url: string, filename: string) => {
if (!process.client) return;
try {
const response = await fetch(url);
const reader = response.body.getReader();
const contentLength = +response.headers.get('Content-Length');
let receivedLength = 0;
const stream = new ReadableStream({
async start(controller) {
while (true) {
const { done, value } = await reader.read();
if (done) {
controller.close();
return;
}
receivedLength += value.length;
const progress = (receivedLength / contentLength * 100).toFixed(2);
console.log(`下载进度: ${progress}%`);
controller.enqueue(value);
}
}
});
const blob = await new Response(stream).blob();
const objectURL = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = objectURL;
a.download = filename || 'download';
a.style.display = 'none';
document.body.appendChild(a);
a.click();
URL.revokeObjectURL(objectURL);
document.body.removeChild(a);
} catch (error) {
console.error('下载失败:', error);
// 可添加错误提示逻辑
}
}
/**
* 判断传入的参数是否为数组
* @param arr - 需要判断的参数
* @returns {boolean} 如果参数是数组则返回true否则返回false
*/
export const isArray = (arr: any) => { // 定义一个名为isArray的导出函数接收任意类型的参数arr
return Array.isArray(arr)
}