interface Filters { percentFormat: (value: number | string | null | undefined) => string; numberFormat: (value: number | string) => string; numberFormat1: (value: number | string) => string; pwdFormat: (value: string | number | null | undefined) => string; numberDecimal: (value: number | string, decimalPlaces?: number) => string; numberDesensitization: (value: number | string) => string; numberDesensitization1: (value: number | string) => string; } /** * 格式化工具组合式函数 * @returns {Filters} 包含所有格式化方法的对象 */ export function useFilters(): Filters { /** * 百分比格式化 */ const percentFormat = (value: number | string | null | undefined): string => { if (value == null || value == undefined) { return '+0%'; } else if (Number(value) < 0) { return value + '%'; } else if (value == '+∞' || value == '-∞') { return String(value); } else { return '+' + value + '%'; } }; /** * 数字千分位格式化(支持负数) * @param {number | string} value - 要格式化的数字或字符串 * @param decimalPlaces 保留的小数位数,默认为2 * @returns {string} 格式化后的字符串 */ const numberFormat = (value: number | string,decimalPlaces:number = 2): string[] | string => { if (value == '***') { return '***'; } if (isNaN(Number(value))||!value ) { return '0.00'; } // let value1 = Number(value).toFixed(2) let value1 = numberDecimal(value,decimalPlaces); console.log(value1) if (value1.indexOf('-') > -1) { value1 = value1.split('-')[1]; let num = value1.split('.'); let interCount = num[0].length; if (interCount < 3) { return numberDecimal(value,decimalPlaces); } let index = 0; let inter = ''; for (let i = interCount - 3; i >= 0; i -= 3) { inter = num[0].substr(i, 3) + (inter == '' ? '' : ',') + inter; index = i; } if (index > 0) { inter = num[0].substr(0, index) + (inter == '' ? '' : ',') + inter; } // return toArray ? ['-' + inter,num[1]] : '-' + inter + (num.length == 1 ? '' : '.' + num[1]); return '-' + inter + (num.length == 1 ? '' : '.' + num[1]); } else { let num = value1.split('.'); let interCount = num[0].length; if (interCount < 3) { return numberDecimal(value,decimalPlaces); } let index = 0; let inter = ''; for (let i = interCount - 3; i >= 0; i -= 3) { inter = num[0].substr(i, 3) + (inter == '' ? '' : ',') + inter; index = i; } if (index > 0) { inter = num[0].substr(0, index) + (inter == '' ? '' : ',') + inter; } // return toArray ? [inter,num[1]] : inter + (num.length == 1 ? '' : '.' + num[1]); return inter + (num.length == 1 ? '' : '.' + num[1]); } }; /** * 数字千分位格式化(简单版) */ const numberFormat1 = (value: number | string): string => { if (value == '--') { return '--'; } if (isNaN(Number(value))) { return '0'; } let num = value.toString().split('.'); let interCount = num[0].length; if (interCount < 3) { return String(value); } let index = 0; let inter = ''; for (let i = interCount - 3; i >= 0; i -= 3) { inter = num[0].substr(i, 3) + (inter == '' ? '' : ',') + inter; index = i; } if (index > 0) { inter = num[0].substr(0, index) + (inter == '' ? '' : ',') + inter; } return inter + (num.length == 1 ? '' : '.' + num[1]); }; /** * 密码格式化 */ const pwdFormat = (value: string | number | null | undefined): string => { if (value == null || value == undefined) { return 'Null'; } else { let len = value.toString().length; let val = ''; for (let i = 0; i < len; i++) { val = val + '*'; } return val; } }; /** * 数字保留指定位数小数(不四舍五入) * @param value 要格式化的数字或字符串 * @param decimalPlaces 保留的小数位数,默认为2 */ const numberDecimal = (value: number | string, decimalPlaces: number = 2): string => { if (isNaN(Number(value)) || value === ''||value == null) { return '0.' + '0'.repeat(decimalPlaces); } const strValue = String(value); const [integerPart, decimalPart = ''] = strValue.split('.'); if (!decimalPart) { return `${integerPart}.` + '0'.repeat(decimalPlaces); } const truncatedDecimalPart = decimalPart.slice(0, decimalPlaces); const paddedDecimalPart = truncatedDecimalPart.padEnd(decimalPlaces, '0'); return `${integerPart}.${paddedDecimalPart}`; }; /** * 数字脱敏(手机号格式) */ const numberDesensitization = (value: number | string): string => { let realVal = ''; if (!isNaN(Number(value)) && value !== '') { const str = value.toString(); realVal = str.substr(0, 2) + '****' + str.substr(-2); } else { realVal = '--'; } return realVal; }; /** * 数字脱敏1(简单格式) */ const numberDesensitization1 = (value: number | string): string => { const str = value.toString(); return str.substr(0, 1) + '***' + str.substr(-2); }; return { percentFormat, numberFormat, numberFormat1, pwdFormat, numberDecimal, numberDesensitization, numberDesensitization1 }; }