|
|
import dayjs from 'dayjs';
|
|
|
|
|
|
const formatTime = (date, template) => dayjs(date).format(template);
|
|
|
|
|
|
/**
|
|
|
* 格式化价格数额为字符串
|
|
|
* 可对小数部分进行填充,默认不填充
|
|
|
* @param price 价格数额,以分为单位!
|
|
|
* @param fill 是否填充小数部分 0-不填充 1-填充第一位小数 2-填充两位小数
|
|
|
*/
|
|
|
function priceFormat(price, fill = 0) {
|
|
|
if (isNaN(price) || price === null || price === Infinity) {
|
|
|
return price;
|
|
|
}
|
|
|
|
|
|
let priceFormatValue = Math.round(parseFloat(`${price}`) * 10 ** 8) / 10 ** 8; // 恢复精度丢失
|
|
|
priceFormatValue = `${Math.ceil(priceFormatValue) / 100}`; // 向上取整,单位转换为元,转换为字符串
|
|
|
if (fill > 0) {
|
|
|
// 补充小数位数
|
|
|
if (priceFormatValue.indexOf('.') === -1) {
|
|
|
priceFormatValue = `${priceFormatValue}.`;
|
|
|
}
|
|
|
const n = fill - priceFormatValue.split('.')[1]?.length;
|
|
|
for (let i = 0; i < n; i++) {
|
|
|
priceFormatValue = `${priceFormatValue}0`;
|
|
|
}
|
|
|
}
|
|
|
return priceFormatValue;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取cdn裁剪后链接
|
|
|
*
|
|
|
* @param {string} url 基础链接
|
|
|
* @param {number} width 宽度,单位px
|
|
|
* @param {number} [height] 可选,高度,不填时与width同值
|
|
|
*/
|
|
|
const cosThumb = (url, width, height = width) => {
|
|
|
if (url.indexOf('?') > -1) {
|
|
|
return url;
|
|
|
}
|
|
|
|
|
|
if (url.indexOf('http://') === 0) {
|
|
|
url = url.replace('http://', 'https://');
|
|
|
}
|
|
|
|
|
|
return `${url}?imageMogr2/thumbnail/${~~width}x${~~height}`;
|
|
|
};
|
|
|
|
|
|
const get = (source, paths, defaultValue) => {
|
|
|
if (typeof paths === 'string') {
|
|
|
paths = paths
|
|
|
.replace(/\[/g, '.')
|
|
|
.replace(/\]/g, '')
|
|
|
.split('.')
|
|
|
.filter(Boolean);
|
|
|
}
|
|
|
const { length } = paths;
|
|
|
let index = 0;
|
|
|
while (source != null && index < length) {
|
|
|
source = source[paths[index++]];
|
|
|
}
|
|
|
return source === undefined || index === 0 ? defaultValue : source;
|
|
|
};
|
|
|
let systemWidth = 0;
|
|
|
/** 获取系统宽度,为了减少启动消耗所以在函数里边做初始化 */
|
|
|
export const loadSystemWidth = () => {
|
|
|
if (systemWidth) {
|
|
|
return systemWidth;
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
({ screenWidth: systemWidth, pixelRatio } = wx.getSystemInfoSync());
|
|
|
} catch (e) {
|
|
|
systemWidth = 0;
|
|
|
}
|
|
|
return systemWidth;
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 转换rpx为px
|
|
|
*
|
|
|
* @description
|
|
|
* 什么时候用?
|
|
|
* - 布局(width: 172rpx)已经写好, 某些组件只接受px作为style或者prop指定
|
|
|
*
|
|
|
*/
|
|
|
const rpx2px = (rpx, round = false) => {
|
|
|
loadSystemWidth();
|
|
|
|
|
|
// px / systemWidth = rpx / 750
|
|
|
const result = (rpx * systemWidth) / 750;
|
|
|
|
|
|
if (round) {
|
|
|
return Math.floor(result);
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 手机号码*加密函数
|
|
|
* @param {string} phone 电话号
|
|
|
* @returns
|
|
|
*/
|
|
|
const phoneEncryption = (phone) => {
|
|
|
return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
|
|
|
};
|
|
|
|
|
|
// 内置手机号正则字符串
|
|
|
const innerPhoneReg =
|
|
|
'^1(?:3\\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\\d|9\\d)\\d{8}$';
|
|
|
|
|
|
/**
|
|
|
* 手机号正则校验
|
|
|
* @param phone 手机号
|
|
|
* @param phoneReg 正则字符串
|
|
|
* @returns true - 校验通过 false - 校验失败
|
|
|
*/
|
|
|
const phoneRegCheck = (phone) => {
|
|
|
const phoneRegExp = new RegExp(innerPhoneReg);
|
|
|
return phoneRegExp.test(phone);
|
|
|
};
|
|
|
|
|
|
module.exports = {
|
|
|
formatTime,
|
|
|
priceFormat,
|
|
|
cosThumb,
|
|
|
get,
|
|
|
rpx2px,
|
|
|
phoneEncryption,
|
|
|
phoneRegCheck,
|
|
|
};
|