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) }