123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468 |
- // 字符串处理相关函数
- // 手机号中间4位加* ------------>
- export function addConfusionForTel (tel) {
- const reg = /^(\d{3})\d{4}(\d{4})$/
- return tel.replace(reg, '$1****$2')
- }
- // 手机号加空格 ------------>
- export function addSpaceForTel (tel) {
- const regMap = {
- isConfuse: /^(\d{3})\*{4}(\d{4})$/,
- addSpace: /^(\d{3})(\d{4})(\d{4})$/
- }
- const confusion = regMap.isConfuse.test(tel)
- if (confusion) {
- return tel.replace(regMap.isConfuse, '$1 **** $2')
- } else {
- return tel.replace(regMap.addSpace, '$1 $2 $3')
- }
- }
- // 银行卡加空格
- export function addSpaceForBank (v, hasConfusion = false) {
- // 无*银行卡号加空格
- if (hasConfusion) {
- // 带有*的银行卡号字符串加空格
- return v.replace(/\s/g, '').replace(/(.{4})/g, '$1 ')
- } else {
- // 纯数字银行卡号字符串加空格
- return v.replace(/\s/g, '').replace(/(\d{4})(?=\d)/g, '$1 ')
- }
- }
- // 银行卡加 **
- export function addConfusionForBank (v) {
- if (String(v).length < 12) {
- return v.replace(/\s/g, '').replace(/^(\d{2})\d+(\d{2})$/, '$1 **** **** $2')
- } else {
- return v.replace(/\s/g, '').replace(/^(\d{4})\d+(\d{4})$/, '$1 **** **** $2')
- }
- }
- export const debounce = (func, delay = 200, immediate) => {
- let timer = null
- return function () {
- let context = this
- let args = arguments
- if (timer) clearTimeout(timer)
- if (immediate) {
- let doNow = !timer
- timer = setTimeout(function () {
- timer = null
- }, delay)
- if (doNow) {
- func.apply(context, args)
- }
- } else {
- timer = setTimeout(function () {
- func.apply(context, args)
- }, delay)
- }
- }
- }
- // 获取url参数
- export function getParam(name) {
- let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
- let r = window.location.search.substr(1).match(reg)
- let context = '' // eslint-disable-line no-unused-vars
- if (r !== null) context = r[2]
- // 释放变量
- reg = null
- r = null
- return context === null || context === '' || context === 'undefined'
- ? ''
- : context
- }
- // 金额处理
- // 分转元
- export function fen2Yuan (v) {
- return v / 100
- }
- // 金额大写,链接:https://juejin.im/post/5a2a7a5051882535cd4abfce
- // upDigit(1682) result:"人民币壹仟陆佰捌拾贰元整"
- // upDigit(-1693) result:"欠壹仟陆佰玖拾叁元整"
- export function upPrice (n) {
- const fraction = ['角', '分', '厘']
- const digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
- const unit = [
- ['元', '万', '亿'],
- ['', '拾', '佰', '仟']
- ]
- // const head = n < 0 ? '欠人民币' : '人民币'
- const head = ''
- n = Math.abs(n)
- let s = ''
- for (let i = 0; i < fraction.length; i++) {
- s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '')
- }
- s = s || '整'
- n = Math.floor(n)
- for (let i = 0; i < unit[0].length && n > 0; i++) {
- let p = ''
- for (let j = 0; j < unit[1].length && n > 0; j++) {
- p = digit[n % 10] + unit[1][j] + p
- n = Math.floor(n / 10)
- }
- s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s
- // s = p + unit[0][i] + s;
- }
- return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整')
- }
- // 金额3位逗号分隔 ------------>
- /**
- * @param s 要格式化的数字(四舍五入)
- * @param n 保留几位小数(不传或者传-1 --> 如果为整数,则不保留小数。如果为浮点数,则保留两位小数)
- * @param comma 是否小数点前每3位添加逗号
- */
- export function newFormat (s = 0, n = -1, comma = false) {
- n = n === -1 ? 0 : n
- if (n > 20 || n < -1) {
- n = 2
- }
- s = Number(s)
- return s.toLocaleString('zh-CN', {
- style: 'decimal',
- useGrouping: comma,
- minimumFractionDigits: n,
- maximumFractionDigits: n
- })
- }
- export function formatPrice (s, n = -1, comma = false) {
- // 如果不传s或者s为空,则直接返回0
- if (!s) return 0
- if (n !== -1) n = n > 0 && n <= 20 ? n : 2
- const intS = parseInt(String(s))
- let point = '.'
- let left = []
- let right = ''
- s = parseFloat((s + '').replace(/[^\d.-]/g, ''))
- // 没传n或者n为-1,默认(如果为整数,则不保留小数。如果为浮点数,则保留两位小数)
- if (n === -1) {
- if (s === intS) {
- n = 0
- right = ''
- point = ''
- } else {
- n = 2
- s = s.toFixed(n)
- right = s.split('.')[1]
- }
- s = s + ''
- left = s.split('.')[0].split('').reverse()
- } else {
- s = parseFloat((s + '').replace(/[^\d.-]/g, '')).toFixed(n) + ''
- left = s.split('.')[0].split('').reverse()
- right = s.split('.')[1]
- }
- if (comma) {
- let t = ''
- for (let i = 0; i < left.length; i++) {
- t += left[i] + ((i + 1) % 3 === 0 && (i + 1) !== left.length ? ',' : '')
- }
- return t.split('').reverse().join('') + point + right
- }
- return left.reverse().join('') + point + right
- }
- // 时间格式化相关函数
- /*
- * 时间格式化函数(将时间格式化为,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 ''
- 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
- }
- // 金额类型转换
- export function moneyUnit(m, type = 'string', lv = 0) {
- const mUnit = {
- levelArr: ['元', '万', '亿', '万亿'],
- test(num, type, lv) {
- if (num === 0) {
- if (type === 'string') {
- return '0元'
- }
- if (type === 'lv') {
- return this.levelArr[lv]
- }
- if (type === 'number') {
- return 0
- }
- if (type === 'index') {
- return lv
- }
- if (type === 'transfer') {
- return 0
- }
- }
- let result = num / Math.pow(10000, lv)
- if (result >= 10000 && lv < 2) {
- return this.test(num, type, lv + 1)
- } else {
- if (type === 'string') {
- return (
- String(Math.floor((result * 100).toPrecision(12)) / 100).replace(
- '.00',
- ''
- ) + this.levelArr[lv]
- )
- }
- if (type === 'fixUnit') {
- if (this.levelArr[lv] === '亿') {
- return (
- String(Math.floor((result * 100).toPrecision(12)) / 100).replace(
- '.00',
- ''
- ) *
- 10000 +
- this.levelArr[lv - 1]
- )
- } else {
- return (
- String(Math.floor((result * 100).toPrecision(12)) / 100).replace(
- '.00',
- ''
- ) + this.levelArr[lv]
- )
- }
- }
- if (type === 'lv') {
- return this.levelArr[lv]
- }
- if (type === 'number') {
- return String(
- Math.floor((result * 100).toPrecision(12)) / 100
- ).replace('.00', '')
- }
- if (type === 'index') {
- return lv
- }
- }
- },
- // 需要传入固定的lv(此时lv为 levelArr 中的一个)
- transfer(num, lvString) {
- const index = this.levelArr.indexOf(lvString)
- if (index === -1 || index === 0) {
- return num
- } else {
- return (num / Math.pow(10000, index)).toFixed(2) + lvString
- }
- }
- }
- if (m === undefined || m === null) {
- return ''
- } else {
- if (type === 'transfer') {
- return mUnit.transfer(m, lv)
- } else {
- return mUnit.test(m, type, lv)
- }
- }
- }
- // 时间戳转换 多少秒、多少分、多少小时前、多少天前 超出10天显示年月日
- // 传入一个时间戳
- export function dateFromNow (timestamp) {
- const date1 = new Date(timestamp) // 开始时间
- const date2 = new Date() // 结束时间
- const date3 = date2.getTime() - date1.getTime() // 时间差的毫秒数
- // 计算出相差天数
- const days = Math.floor(date3 / (24 * 3600 * 1000))
- // 计算出小时数
- const leave1 = date3 % (24 * 3600 * 1000) // 计算天数后剩余的毫秒数
- const hours = Math.floor(leave1 / (3600 * 1000))
- // 计算相差分钟数
- const leave2 = leave1 % (3600 * 1000) // 计算小时数后剩余的毫秒数
- const minutes = Math.floor(leave2 / (60 * 1000))
- // 计算相差秒数
- let td = '30秒前'
- if (days > 0) {
- if (days > 10) {
- const date1year = date1.getFullYear()
- const date2year = date2.getFullYear()
- let date1month = date1.getMonth() + 1
- let date1day = date1.getDate()
- if (date1month < 10) {
- date1month = '0' + date1month
- }
- if (date1day < 10) {
- date1day = '0' + date1day
- }
- if (date1year < date2year) {
- td = date1.getFullYear() + '-' + date1month + '-' + date1day
- } else {
- td = date1month + '-' + date1day
- }
- } else {
- td = days + '天前'
- }
- } else if (hours > 0) {
- td = hours + '小时前'
- } else if (minutes > 0) {
- td = minutes + '分钟前'
- }
- return td
- }
- // 文件大小格式化
- export function formatSize (size, pointLength, units) {
- size = Number(size)
- let unit = ''
- units = units || ['B', 'K', 'M', 'G', 'TB']
- while ((unit = units.shift()) && size > 1024) {
- size = size / 1024
- }
- return (unit === 'B' ? size : size.toFixed(pointLength === undefined ? 2 : pointLength)) + (unit || '')
- }
- // 文件类型转换
- export function docTypeConvert (docType = 'pdf') {
- const typeMap = {
- doc: 'word',
- docx: 'word',
- xls: 'excel',
- xlsx: 'excel',
- ppt: 'ppt',
- pdf: 'pdf',
- txt: 'txt',
- 1: 'word', // doc
- 2: 'pdf',
- 3: 'excel', // xls
- 4: 'ppt',
- 5: 'txt',
- 6: '其他'
- }
- const type = typeMap[docType]
- return type || docType // map中不存在的,则返回原始类型
- }
- /**
- * 通用关键字高亮替换
- * @param {String} value 要高亮的字符串
- * @param {String|Array} oldChar 要被替换的字符串(或数组)
- * @param {String|Array} newChar 要替换成的字符串(或数组)
- *
- * 比如:要将 - `剑鱼标讯工具函数` 字符串中的 `工具` 高亮
- * 则此时 value -> `剑鱼标讯工具函数`
- * oldChar -> `工具`
- * newChar -> `<span class="highlight-text">工具</span>`
- *
- * 批量高亮-----
- * 比如:要将 - `剑鱼标讯工具函数` 字符串中的 `工具` `剑鱼` 高亮
- * 则此时 value -> `剑鱼标讯工具函数批量高亮`
- * oldChar -> ['工具', '剑鱼']
- * newChar -> ['<span class="highlight-text">', '</span>']
- *
- * 注意:此时newChar为一个长度为2的数组,数组中为高亮标签的起始标签和结束标签
- *
- */
- export function replaceKeyword (value, oldChar, newChar) {
- if (!oldChar || !newChar) return value
- // oldChar的字符串数组,用来循环替换
- var oldCharArr = []
- if (Array.isArray(oldChar)) {
- oldCharArr = oldChar.concat()
- } else {
- oldCharArr.push(oldChar)
- }
- // 数组去重
- oldCharArr = Array.from(new Set(oldCharArr))
- try {
- oldCharArr.forEach(function (item) {
- // 去空格之后为空字符串,则直接跳过当前替换
- if (item.replace(/\s+/g, '')) {
- var oc = item
- oc = oc.replace(/\$/g, '\\$')
- .replace(/\(/g, '\\(')
- .replace(/\)/g, '\\)')
- .replace(/\*/g, '\\*')
- .replace(/\+/g, '\\+')
- .replace(/\./g, '\\.')
- .replace(/\[/g, '\\[')
- .replace(/\]/g, '\\]')
- .replace(/\?/g, '\\?')
- .replace(/\\/g, '\\')
- .replace(/\//g, '\\/')
- .replace(/\^/g, '\\^')
- .replace(/\{/g, '\\{')
- .replace(/\}/g, '\\}')
- .replace(/\|/g, '\\|')
- if (Array.isArray(newChar)) {
- // 批量高亮
- var tempV = value
- value = value.replace(new RegExp('(' + oc + ')', 'gmi'), newChar[0] + oc + newChar[1])
- if (value === tempV && oc.indexOf('+') !== -1) {
- var splitReg = oc.split('\\+')
- splitReg.map(function (v) {
- value = value.replace(new RegExp('(' + v + ')', 'gmi'), newChar[0] + v + newChar[1])
- })
- }
- } else {
- // 普通单个高亮
- value = value.replace(new RegExp('(' + oc + ')', 'gmi'), newChar)
- }
- }
- })
- } catch (e) {
- console.log(e)
- return value
- }
- return value
- }
- export function recoveryPageData (key, defaultValues = []) {
- return sessionStorage.getItem(key) ? JSON.parse(sessionStorage.getItem(key) || '') : defaultValues
- }
|