142 lines
5.2 KiB
TypeScript
142 lines
5.2 KiB
TypeScript
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)
|
||
} |