WebApp【公共组件库】@前端(For Git Submodule)
Tevin
2025-03-07 2f2be05b8caedd31bfd9d68110ea8c1267971f03
common/Tools.js
@@ -6,6 +6,8 @@
import moment from 'moment';
import Taro from '@tarojs/taro';
moment.locale('zh-cn');
export class Tools {
    /**
     * 显示消息
@@ -47,7 +49,7 @@
     * @return {string}
     */
    static createGUID() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
            let r = (Math.random() * 16) | 0,
                v = c === 'x' ? r : (r & 0x3) | 0x8;
            return v.toString(16);
@@ -436,16 +438,88 @@
    /**
     * 数值转换为金钱格式
     * @param {Number|String} number
     * @param {String} [forRead=''] 便于阅读财务金额模式
     * @return {string}
     */
    static moneyFormat(number) {
    static moneyFormat(number, forRead = '') {
        if (!number && typeof number !== 'number' && typeof number !== 'string') {
            return '';
        }
        if (typeof number === 'string') {
            number = Number(number) || 0;
        }
        return number.toFixed(2);
        if (forRead === 'forRead') {
            return number.toLocaleString('zh-cn', {
                minimumFractionDigits: 2,
                maximumFractionDigits: 2,
            });
        } else {
            return number.toFixed(2);
        }
    }
    /**
     * 数值转换为千分位格式
     * @param {Number|String} number - 传入的值
     * @param {String} decimalFormat - 处理小数的方式  - notRetain(不保留小数,有小数时也会去掉小数位),keepTwo(保留两位小数),keepThree(保留三位小数)
     * @return {string}
     */
    static thousandFormat(number, decimalFormat = 'keepTwo') {
        if (!number && typeof number !== 'number' && typeof number !== 'string') {
            return '';
        }
        // 原始数据
        let num = number.toString();
        // 需要进千分位的数,小数点前的数才需要进行千分位计算,即整数位
        let needThousand = '';
        // 小数位
        let decimals = '';
        // 没有小数位
        if (!(num.indexOf('.') > -1)) {
            needThousand = num.toString();
            if (decimalFormat === 'keepTwo') {
                decimals = '00';
            } else if (decimalFormat === 'keepThree') {
                decimals = '000';
            }
        }
        // 存在小数位时
        else if (num.indexOf('.') > -1) {
            needThousand = num.split('.')[0].toString();
            if (decimalFormat === 'keepTwo') {
                decimals = Number(num).toFixed(2).split('.')[1] || '';
            } else if (decimalFormat === 'keepThree') {
                decimals = Number(num).toFixed(3).split('.')[1] || '';
            }
        }
        // 计算整数位长度
        let len = needThousand.length;
        // 如果整数位小于3,直接返回
        if (len <= 3) {
            return decimals ? needThousand + '.' + decimals : needThousand;
        }
        // 整数位大于3
        else {
            // 小数位后的值
            let temp = '';
            // 对整数取余
            let remainder = len % 3;
            if (decimals) {
                temp = '.' + decimals;
            }
            if (remainder > 0) {
                // 不是3的整数倍
                return (
                    needThousand.slice(0, remainder) +
                    ',' +
                    needThousand.slice(remainder, len).match(/\d{3}/g)?.join(',') +
                    temp
                );
            } else {
                // 3的整数倍
                return needThousand.slice(0, len).match(/\d{3}/g)?.join(',') + temp;
            }
        }
    }
    /**
@@ -526,13 +600,12 @@
     * @return {String}
     */
    static transWeekIndexToDate(year, week, weekDay) {
        const yearStart = moment([year, 0, 1]);
        const dayLong = 24 * 60 * 60 * 1000;
        const firstWeekLong = (7 - yearStart.day()) * dayLong;
        const weeksLong = (week - 1) * 7 * dayLong;
        const weekDayLong = weekDay * dayLong;
        const dayTimestamp = yearStart.valueOf() + firstWeekLong + weeksLong + weekDayLong;
        return moment(dayTimestamp).format('YYYY-MM-DD');
        if (weekDay < 1 && weekDay > 7) {
            return '';
        }
        const weekDate = moment(year + '-' + week, 'YYYY-WW');
        const firstDay = weekDate.startOf('week');
        return firstDay.add(weekDay - 1, 'day').format('YYYY-MM-DD');
    }
    /**
@@ -542,44 +615,68 @@
     * @param {Function} fnc
     * @param {Number} wait
     * @returns {Function}
     * @tutorial Tools.debounce(<fnc>, <wait>)(<DebounceKey>)
     */
    static debounce(fnc, wait = 200) {
        let timeout = null;
        return function() {
            const context = this;
            const args = arguments;
            if (timeout) {
                clearTimeout(timeout);
        return key => {
            if (!key || !Tools.isString(key)) {
                throw 'Debounce function need a key!';
            }
            const callNow = !timeout;
            timeout = setTimeout(() => {
                timeout = null;
            }, wait);
            if (callNow) {
                fnc.apply(context, args);
            const timer = Tools.debounce['dKey-' + key];
            if (timer) {
                clearTimeout(timer);
            }
            Tools.debounce['dKey-' + key] = setTimeout(fnc, wait);
        };
    }
    /**
     * 节流函数(一段时间周期内,仅执行第一次回调)
     * 节流函数(本段时间内,仅执行第一次回调)
     *  在一定时间内只能触发一次函数执行
     *  如果这个时间内再次触发,则忽略,直到下一个时间段再次触发
     * @param {Function} fnc
     * @param {Number} wait
     * @returns {Function}
     * @returns {function(key):void}
     * @tutorial Tools.throttle(<fnc>, <wait>)(<ThrottleKey>)
     */
    static throttle(fnc, wait = 200) {
        let previous = 0;
        return function() {
            const context = this;
            const args = arguments;
            const now = new Date();
        return key => {
            if (!key || !Tools.isString(key)) {
                throw 'Throttle function need a key!';
            }
            const previous = Tools.throttle['tKey-' + key] || 0;
            const now = Date.now();
            if (now - previous > wait) {
                fnc.apply(context, args);
                previous = now;
                Tools.throttle['tKey-' + key] = now;
                fnc();
            }
        };
    }
    /**
     * 精确保留小数点几位数, 自动补零, 四舍五入
     *  修复 toFixed 四舍六入五讨论的问题
     * @param {Number|String} num 数值
     * @param {Number} [digit=0] 小数点后位数
     * @returns {String|NaN}
     */
    static accFixed(num, digit = 0) {
        const number = parseFloat(num);
        if (isNaN(number)) {
            return NaN;
        }
        if (number >= 0) {
            return (
                Math.round((number + Number.EPSILON) * Math.pow(10, digit)) / Math.pow(10, digit)
            ).toFixed(digit);
        } else {
            return (
                '-' +
                (
                    Math.round((Math.abs(number) + Number.EPSILON) * Math.pow(10, digit)) /
                    Math.pow(10, digit)
                ).toFixed(digit)
            );
        }
    }
}
@@ -599,5 +696,3 @@
        console.info(Math.round(px) + 'px');
    };
}
global.Tools = Tools;