Эх сурвалжийг харах

feat: package @jy/util 工具包迁移部分对应工具函数

zhangyuhan 1 жил өмнө
parent
commit
c66b2a49af

+ 61 - 0
packages/util/modules/format/date.js

@@ -0,0 +1,61 @@
+/*
+ * 时间格式化函数(将时间格式化为,2019年08月12日,2019-08-12,2019/08/12的形式)
+ *   pattern参数(想要什么格式的数据就传入什么格式的数据)
+ *     · 'yyyy-MM-dd'  ---> 输出如2019-09-20
+ *     · 'yyyy-MM-dd HH:mm'  --->  输出如2019-09-20 18:20
+ *     · 'yyyy-MM-dd HH:mm:ss'  --->  输出如2019-09-20 06:20:23
+ *     · 'yyyy/MM/dd'  --->  输出如2019/09/20
+ *     · 'yyyy年MM月dd日'  --->  输出如2019年09月20日
+ *     · 'yyyy年MM月dd日 HH时mm分'  --->  输出如2019年09月20日 18时20分
+ *     · 'yyyy年MM月dd日 HH时mm分ss秒'  --->  输出如2019年09月20日 18时20分23秒
+ *     · 'yyyy年MM月dd日 HH时mm分ss秒 EE'  --->  输出如2019年09月20日 18时20分23秒 周二
+ *     · 'yyyy年MM月dd日 HH时mm分ss秒 EEE'  --->  输出如2019年09月20日 18时20分23秒 星期二
+ *  参考: https://www.cnblogs.com/mr-wuxiansheng/p/6296646.html
+ */
+export function dateFormatter(date = '', fmt = 'yyyy-MM-dd HH:mm:ss') {
+  // 将传入的date转为时间对象
+  if (!date) return ''
+  // 处理ios不兼容'2022-6-6'类似的'-'问题
+  if (typeof data === 'string') {
+    date = date.replace(/-/g, '/')
+  }
+  date = new Date(date)
+  const o = {
+    'y+': date.getFullYear(),
+    'M+': date.getMonth() + 1, // 月份
+    'd+': date.getDate(), // 日
+    // 12小时制
+    'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 小时
+    // 24小时制
+    'H+': date.getHours(), // 小时
+    'm+': date.getMinutes(), // 分
+    's+': date.getSeconds(), // 秒
+    'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
+    S: date.getMilliseconds(), // 毫秒
+    'E+': date.getDay() // 周
+  }
+  const week = ['日', '一', '二', '三', '四', '五', '六']
+
+  if (/(y+)/.test(fmt)) {
+    fmt = fmt.replace(
+      RegExp.$1,
+      (date.getFullYear() + '').substr(4 - RegExp.$1.length)
+    )
+  }
+  if (/(E+)/.test(fmt)) {
+    fmt = fmt.replace(
+      RegExp.$1,
+      (RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' : '周') : '') +
+      week[date.getDay()]
+    )
+  }
+  for (const k in o) {
+    if (new RegExp('(' + k + ')').test(fmt)) {
+      fmt = fmt.replace(
+        RegExp.$1,
+        RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
+      )
+    }
+  }
+  return fmt
+}

+ 2 - 12
packages/util/modules/format/index.js

@@ -1,12 +1,2 @@
-/**
- * 示例: 用于为金额添加后缀单位展示
- * @param money - 金额
- * @returns {string}
- */
-function formatMoney (money) {
-    return money + '万元'
-}
-
-export {
-    formatMoney
-}
+export * from './money'
+export * from './date'

+ 120 - 0
packages/util/modules/format/money.js

@@ -0,0 +1,120 @@
+/**
+ * 金额转换
+ * @param money 金额
+ * @param config
+ * @param config.type 类型 full | number | unit
+ * @param config.level 初始单位索引
+ * @param config.levelArr 单位数组 ['元', '万', '亿', '万亿']
+ * @param config.unit 计算单位 10000
+ * @param config.digit 精度,保留小数位数 2
+ * @param config.degrade 指定单位索引时,所需精度不够是否降级单位 false
+ * @returns {*|string|string|number}
+ */
+function recursiveCalculationMoney(money, config = {}, start = false) {
+  const { type, level, levelArr, unit, digit, degrade } = Object.assign(
+    {
+      type: 'full',
+      level: 0,
+      levelArr: ['元', '万元', '亿元', '万亿元'],
+      digit: 2,
+      degrade: false,
+      unit: 10000
+    },
+    config
+  )
+  // 提取纯数字
+  let computMoney = String(money).match(/^\d+(\.\d+)?/g) || [0]
+  computMoney = Number(computMoney[0])
+  // 是否指定单位索引
+  const lockUnit = start && level > 0
+  // 判断是否需要递归单位
+  if (!lockUnit) {
+    const canNext =
+      computMoney / Math.pow(unit, level + 1) >= 1 &&
+      level + 1 < levelArr.length
+    if (canNext) {
+      return recursiveCalculationMoney(computMoney, {
+        type,
+        level: level + 1,
+        levelArr,
+        digit,
+        degrade,
+        unit
+      })
+    }
+  }
+  // 浮点数精度
+  const digitNumber = Math.pow(10, digit)
+  // 指定单位索引时,如不满足精度要求,是否需要降级单位处理
+  let computLevel = level
+  const needDegrade =
+    degrade && computMoney * digitNumber < Math.pow(unit, level)
+  if (lockUnit && needDegrade) {
+    computLevel--
+  }
+  // 计算金额
+  const addPowMoney = Math.floor(
+    Number(
+      ((computMoney / Math.pow(unit, computLevel)) * digitNumber).toPrecision(
+        12
+      )
+    )
+  )
+  const resetPowMoney = Number((addPowMoney / digitNumber).toPrecision(12))
+  computMoney = resetPowMoney
+  // 返回结果
+  switch (type) {
+    case 'full': {
+      if (computMoney === 0) {
+        return ''
+      } else {
+        return computMoney + levelArr[computLevel]
+      }
+    }
+    case 'unit': {
+      return levelArr[computLevel]
+    }
+    case 'number': {
+      return computMoney
+    }
+  }
+}
+
+/**
+ * 金额转换
+ * @param money 金额
+ * @param config
+ * @param config.type 类型 full | number | unit
+ * @param config.level 初始单位索引
+ * @param config.levelArr 单位数组 ['元', '万元', '亿元', '万亿元']
+ * @param config.unit 计算单位 10000
+ * @param config.digit 精度,保留小数位数 2
+ * @param config.degrade 指定单位索引时,所需精度不够是否降级单位 false
+ * @returns {*|string|string|number}
+ */
+export function formatMoney(money, config = {}) {
+  if (config.level === 1 && !config.degrade) {
+    // 万元单位, 并且不单位降级, 则小于100元的金额会被舍弃, 造成显示空白
+    // 此处逻辑: 单位固定万元,不降级. 金额<10000, 展示元为单位
+    if (money && money > 0 && money < 10000) {
+      return `${money}元`
+    } else {
+      return recursiveCalculationMoney(money, config, true)
+    }
+  } else {
+    return recursiveCalculationMoney(money, config, true)
+  }
+}
+
+/**
+ * 金额浮点问题修复
+ * @param number
+ * @returns {number}
+ */
+export function formatNumber(number) {
+  return Number(number.toFixed(12))
+}
+// 元转分
+export function yuan2Fen(v) {
+  return formatNumber((v * 10000) / 100)
+}

+ 7 - 0
packages/util/package.json

@@ -6,6 +6,13 @@
   "scripts": {
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1"
     "test": "echo \"Error: no test specified\" && exit 1"
   },
   },
+  "files": [
+    "modules"
+  ],
+  "exports": {
+    ".": "./index.js",
+    "./modules/*": "./modules/*"
+  },
   "keywords": [],
   "keywords": [],
   "author": "",
   "author": "",
   "license": "ISC"
   "license": "ISC"