UNPKG

inferno-utils

Version:
139 lines (107 loc) 4.95 kB
const _ = require('lodash'); /** * 添加分割符 * @param {* 分割目标,类型: String ,必选参数 } target * @param {* 分割方向,类型: Boolean ,可选参数,备选值:从左到右 true 或从右到左 false ,默认值:从左到右 true } direction * @param {* 分割符,类型: String ,可选参数 } delimiter * @param {* 间隔,类型: Number ,可选参数 } interval */ const addDelimiter = function () { let _opts = { target: null, // 分割目标,类型: String,必选参数 direction: true, // 分割方向,类型: Boolean ,可选参数,备选值:从左到右 true 或从右到左 false ,默认值:从左到右 true delimiter: ' ', // 分割符,类型: String ,可选参数 interval: 5 // 间隔,类型: Number ,可选参数 } _.assign(_opts, arguments[0] || {}); return function () { _.assign(_opts, arguments[0] || {}); // 若未传入分割目标,则停止 if (!_opts.target) { console.error('未传入必须参数:分割目标 target '); return false; } let _targetType = typeof _opts.target, _targetArr = _targetType === 'number' ? _opts.target.toString().split('') : _opts.target.split(''), _targetArrLen = _targetArr.length; let _q = _targetArrLen / _opts.interval; let _resArr = [], _resStr = ''; // 根据传入分割方向,处理原始数组 _targetArr = _opts.direction ? _targetArr : _targetArr.reverse(); // 根据传入间隔,分割原始数组并连接为返回数组 for (let _i = 0; _i < _q; _i++) { _resArr = _resArr.concat(_targetArr.splice(0, _opts.interval)).concat(_opts.delimiter); } // 末尾不添加分割符 _resArr.pop(); // 根据传入分割方向,处理返回数组 _resArr = _opts.direction ? _resArr : _resArr.reverse(); // 将返回数组转化为字符串 _resStr = _resArr.join(''); return _resStr; }; } /** * 格式化金额 * @param {* 分割目标,类型: String ,必选参数 } target * @param {* 是否千分位添加逗号,类型: Boolean ,可选参数,备选值:开启 true 或关闭 false ,默认值:开启 true } addComma * @param {* 保留小数位数,类型: Number ,可选参数 } decimal * @param {* 是否四舍五入,类型: Boolean ,可选参数,备选值:四舍五入 true 或非四舍五入 false ,默认值:四舍五入 true } round */ const formatAmount = function () { let _opts = { target: null, // 分割目标,类型: String ,必选参数 addComma: true, // 是否千分位添加逗号,类型: Boolean ,可选参数,备选值:开启 true 或关闭 false ,默认值:开启 true decimal: 2, // 保留小数位数,类型: Number ,可选参数 round: true // 是否四舍五入,类型: Boolean ,可选参数,备选值:四舍五入 true 或非四舍五入 false ,默认值:四舍五入 true } _.assign(_opts, arguments[0] || {}); return function () { _.assign(_opts, arguments[0] || {}); // 若未传入分割目标,则停止 if (!_opts.target) { console.error('未传入必须参数:分割目标 target '); return false; } let _resArr = [], _i, _d, _resIntStr, _resDecStr, _resStr; // 检查传入金额是否存在小数部分,分离整数和小数 _resArr = _opts.target.split('.'); _i = _resArr[0]; _d = _resArr[1] ? `0.${_resArr[1]}` : `0.`; // 检查整数部分是否符合规范 if (!_i || _i.length > 1 && _i.indexOf('0') === 0) { console.error('请传入符合规范的金额'); return false; } // 根据传入是否千分位添加逗号,处理整数部分 _resIntStr = _opts.addComma ? _addComma({ target: _i }) : _i; // 根据传入保留小数位数和保留小数类型,处理小数部分 _resDecStr = _opts.round ? Number(_d).toFixed(_opts.decimal).toString() : _zeroFill(_d, _opts.decimal).substr(0, _opts.decimal + 2); // 将整数部分和小数部分连接并返回 _resStr = `${_resIntStr}${_resDecStr.substr(1)}`; return _resStr; }; } /** * 千分位添加逗号 */ const _addComma = addDelimiter({ direction: false, delimiter: ', ', interval: 3 }); /** * 末尾补足零 */ const _zeroFill = function (_target, _number) { if (!_target || !_number) { console.error('请传入补足目标和位数') return false; } for (let _i = 0; _i < _number; _i++) { _target = _target.concat('0'); } return _target; } module.exports = { addDelimiter, formatAmount };