haw-utils
Version:
一个基于业务场景的工具方法库
151 lines (143 loc) • 6.75 kB
JavaScript
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(["exports", "../utils/math.util", "../utils/type/isNaN"], factory);
} else if (typeof exports !== "undefined") {
factory(exports, require("../utils/math.util"), require("../utils/type/isNaN"));
} else {
var mod = {
exports: {}
};
factory(mod.exports, global.utilsMathUtil, global.utilsTypeIsNaN);
global.formatMoney = mod.exports;
}
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _math, _isNaN) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports["default"] = void 0;
_isNaN = _interopRequireDefault(_isNaN);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0) { ; } } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var reg = /^[+-]?\d*\.?\d*$/;
// 检查数字或数字字符串
function checkNumber(num) {
if (!(reg.test(num) || (0, _math.isScientificNumber)(num)) || (0, _isNaN["default"])(num) || typeof num !== 'number' && typeof num !== 'string' || num === '') {
console.warn("".concat(num, " invalid parameter."));
return false;
}
// 数字超限如果不是是字符串,可能有异常
// 如 1111111111111111111111 // => 1.1111111111111111e+21
if (typeof num === 'number') {
(0, _math.checkBoundary)(num);
}
return true;
}
// 格式化整数部分
function formatInt(intStr, thousand) {
var txt = '';
intStr = intStr[0] === '+' ? intStr.substr(1) : intStr; // 去掉+符号
var negativeSymbol = Number(intStr) < 0 ? '-' : '';
var reArr = negativeSymbol ? intStr.substr(1).split('').reverse() : intStr.split('').reverse();
for (var i = 0; i < reArr.length; i++) {
txt += reArr[i] + ((i + 1) % 3 === 0 && i + 1 !== reArr.length ? thousand : '');
}
return negativeSymbol + txt.split('').reverse().join('');
}
// 格式化小数部分,如果使用 toFixed,超大额数字会自动被截断
function formatDec(decStr, precision, decimal) {
if (precision === 0) {
return '';
}
var zero = 0;
var ret = '';
if (decStr && Number(decStr) > 0) {
var tmpNum = parseFloat('0.' + decStr);
ret = tmpNum.toFixed(precision).substr(2);
} else {
ret = zero.toFixed(precision).substr(2);
}
return decimal + ret;
}
/**
* 格式化金额
*
* @static
* @alias module:Processor.formatMoney
* @since 1.1.0
* @param {String | Number} num 需转换金额 (最大:9007199254740991 最小: -9007199254740991)
* @param {Object} [options] - 金额格式化配置
* @param {String | Number} [options.precision=2] - 保留位数 (最高:10位)
* @param {String} [options.symbol] - 货币符号
* @param {String} [options.thousand=,] - 千分位符号
* @param {String} [options.decimal=.] - 小数位符号
* @returns {String} 格式化的金额
* @example
*
* // 整数
* formatMoney('1000');
* // => 1,000.00
*
* // 小数(默认保留2位小数)
* formatMoney('3000.03');
* // => 3,000.03
*
* // 保留4位小数
* formatMoney('3000.0300', { precision: 4 });
* // => 3,000.0300
*
* // 保留10位小数
* formatMoney('1500.2', { precision: 10 });
* // => 1,500.2000000000
*
* // 自定义单位符号
* formatMoney(1000.00, { symbol: '$' });
* // => $1,000.00
*
* // 自定义千位分割符(默认',')
* formatMoney(1000.00, { thousand: '|' });
* // => 1|000.00
*
* // 自定义小数位分割符(默认'.')
* formatMoney(1000.00, { thousand: '&' });
* // => 1,000&00
*/
var formatMoney = function formatMoney(num) {
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
_ref$precision = _ref.precision,
precision = _ref$precision === void 0 ? 2 : _ref$precision,
symbol = _ref.symbol,
_ref$thousand = _ref.thousand,
thousand = _ref$thousand === void 0 ? ',' : _ref$thousand,
_ref$decimal = _ref.decimal,
decimal = _ref$decimal === void 0 ? '.' : _ref$decimal;
// 数字参数不正确,返回空字符串
if (!checkNumber(num)) {
return '';
}
// 参数规整化
if (typeof precision !== 'number' || (0, _isNaN["default"])(precision) || precision < 0) {
precision = 2;
} else if (precision > 10) {
precision = 10;
}
symbol = typeof symbol === 'string' ? symbol : '';
thousand = typeof thousand === 'string' ? thousand : ',';
decimal = typeof decimal === 'string' ? decimal : '.';
// 转换数字字符串,支持科学记数法
var numStr = (0, _math.scientificToNumber)(num) + '';
// 整数和小数部分
var _numStr$split = numStr.split('.'),
_numStr$split2 = _slicedToArray(_numStr$split, 2),
intStr = _numStr$split2[0],
decStr = _numStr$split2[1];
return symbol + formatInt(intStr, thousand) + formatDec(decStr, precision, decimal);
};
var _default = formatMoney;
_exports["default"] = _default;
});