From c40e7ce5519f6caa14dc11c13612f37d7b914646 Mon Sep 17 00:00:00 2001
From: Tevin <tingquanren@163.com>
Date: Tue, 04 Mar 2025 18:24:03 +0800
Subject: [PATCH] 知识库添加文档,公共工具箱

---
 common/Tools.js |  120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 109 insertions(+), 11 deletions(-)

diff --git a/common/Tools.js b/common/Tools.js
index 72d2079..2f0635d 100644
--- a/common/Tools.js
+++ b/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');
     }
 
     /**
@@ -579,6 +652,32 @@
             }
         };
     }
+    /**
+     * 精确保留小数点几位数, 自动补零, 四舍五入
+     *  修复 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)
+            );
+        }
+    }
 }
 
 // h5 中,实现 rem 转换 px
@@ -597,4 +696,3 @@
         console.info(Math.round(px) + 'px');
     };
 }
-

--
Gitblit v1.9.1