UNPKG

dareway-rui

Version:

441 lines (374 loc) 15.3 kB
'use strict'; var _interopRequireDefault = require('@babel/runtime/helpers/interopRequireDefault'); Object.defineProperty(exports, '__esModule', { value: true }); exports.normalizeNumberData = normalizeNumberData; exports.clearNumberData = clearNumberData; exports.canNumberDataPassRequiredTest = canNumberDataPassRequiredTest; exports.stringToNumber = stringToNumber; exports.formatNumber = formatNumber; var _slicedToArray2 = _interopRequireDefault(require('@babel/runtime/helpers/slicedToArray')); var _typeof2 = _interopRequireDefault(require('@babel/runtime/helpers/typeof')); var _util = require('../../util'); var _lodash = _interopRequireDefault(require('lodash')); /** * TestCase: * * * @param data * @param nullable * @param zeroDisplayAs0 * @param mask * @param maxLength * @param debugMsg * @returns {{value: (number|*)}} */ function normalizeNumberData(data, nullable, zeroDisplayAs0, mask, maxLength, debugMsg) { /** * 入参正确性检查 */ if (data != null && typeof data !== 'string' && typeof data !== 'number') { throw new Error( '' .concat( debugMsg, ',\u5165\u53C2 data \u53EA\u5141\u8BB8\u4F20\u5165\u3010null\u3001string\u3001number\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' ) .concat(data, ', ') .concat((0, _typeof2.default)(data), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if (typeof nullable !== 'boolean') { throw new Error( '' .concat( debugMsg, ',\u5165\u53C2 nullable \u53EA\u5141\u8BB8\u4F20\u5165\u3010boolean\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' ) .concat(nullable, ', ') .concat((0, _typeof2.default)(nullable), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if (typeof zeroDisplayAs0 !== 'boolean') { throw new Error( '' .concat( debugMsg, ',\u5165\u53C2 zeroDisplayAs0 \u53EA\u5141\u8BB8\u4F20\u5165\u3010boolean\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' ) .concat(zeroDisplayAs0, ', ') .concat((0, _typeof2.default)(zeroDisplayAs0), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if (typeof mask !== 'string') { throw new Error( '' .concat( debugMsg, ',\u5165\u53C2 mask \u53EA\u5141\u8BB8\u4F20\u5165\u3010string\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' ) .concat(mask, ', ') .concat((0, _typeof2.default)(mask), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if (typeof maxLength !== 'number') { throw new Error( '' .concat( debugMsg, ',\u5165\u53C2 maxLength \u53EA\u5141\u8BB8\u4F20\u5165\u3010number\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' ) .concat(maxLength, ', ') .concat((0, _typeof2.default)(maxLength), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } var normalizedData; if (data == null) { if (nullable) { normalizedData = null; } else { normalizedData = 0; } } else if (typeof data === 'string') { if (data === '') { if (nullable) { normalizedData = null; } else { normalizedData = 0; } } else { normalizedData = stringToNumber(data); if (Number.isNaN(normalizedData)) { throw new Error( '' .concat(debugMsg, '\uFF0C\u5165\u53C2 data \u4E3A string \u7C7B\u578B\uFF0C\u4F46\u503C\u3010') .concat( data, '\u3011\u65E0\u6CD5\u8F6C\u6362\u4E3A number \u578B\u6570\u503C\uFF0C\u8BF7\u68C0\u67E5\uFF01' ) ); } normalizedData = formatNumber(normalizedData, nullable, zeroDisplayAs0, mask, maxLength); normalizedData = stringToNumber(normalizedData); } } else if (typeof data === 'number') { normalizedData = formatNumber(data, nullable, zeroDisplayAs0, mask, maxLength); normalizedData = stringToNumber(normalizedData); } else { '' .concat( debugMsg, ',\u5165\u53C2 data \u53EA\u5141\u8BB8\u4F20\u5165\u3010null\u3001string\u3001number\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' ) .concat(data, ', ') .concat((0, _typeof2.default)(data), '\u3011\uFF0C\u8BF7\u68C0\u67E5!'); } return normalizedData; } function clearNumberData(nullable, zeroDisplayAs0, mask, maxLength, debugMsg) { return normalizeNumberData(null, nullable, zeroDisplayAs0, mask, maxLength, debugMsg); } function canNumberDataPassRequiredTest(data, required, nullable, zeroDisplayAs0, debugMsg) { /** * 入参正确性检查 */ if (data != null && typeof data !== 'number') { throw new Error( '' .concat( debugMsg, ',\u5165\u53C2 data \u53EA\u5141\u8BB8\u4F20\u5165\u3010null\u3001number\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' ) .concat(data, ', ') .concat((0, _typeof2.default)(data), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if (typeof required !== 'boolean') { throw new Error( '' .concat( debugMsg, ',\u5165\u53C2 required \u53EA\u5141\u8BB8\u4F20\u5165\u3010boolean\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' ) .concat(required, ', ') .concat((0, _typeof2.default)(required), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if (typeof nullable !== 'boolean') { throw new Error( '' .concat( debugMsg, ',\u5165\u53C2 nullable \u53EA\u5141\u8BB8\u4F20\u5165\u3010boolean\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' ) .concat(nullable, ', ') .concat((0, _typeof2.default)(nullable), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if (typeof zeroDisplayAs0 !== 'boolean') { throw new Error( '' .concat( debugMsg, ',\u5165\u53C2 zeroDisplayAs0 \u53EA\u5141\u8BB8\u4F20\u5165\u3010boolean\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' ) .concat(zeroDisplayAs0, ', ') .concat((0, _typeof2.default)(zeroDisplayAs0), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if (!required) { return true; } if (nullable) { if (data == null) { return false; } if (!zeroDisplayAs0 && data === 0) { return false; } } else { if (!zeroDisplayAs0 && (data === 0 || data == null)) { return false; } } return true; } /** * stringToNumber * * "" ==> 0 * * * @param data * @returns {number} */ function stripDelimiters(value, delimiter) { var delimiterRE = new RegExp(delimiter.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'), 'g'); return value.replace(delimiterRE, ''); } function stringToNumber(data) { if (typeof data !== 'string') { throw new Error( 'stringToNumber \u5165\u53C2 data \u53EA\u5141\u8BB8\u4F20\u5165\u3010string\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' .concat(data, ', ') .concat((0, _typeof2.default)(data), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if (!data) { return 0; } // 去掉千位分隔符"," data = stripDelimiters(data, ','); if (data.indexOf('%') !== -1) { // 去掉百分号 data = data.slice(0, -1); if (Number.isNaN(Number(data))) { return Number.NaN; } return parseFloat(data) / 100; } else { if (Number.isNaN(Number(data))) { return Number.NaN; } return parseFloat(data); } } /** * TODO:如果值太大怎么办???即出现科学计数法... * * 1. 四舍五入 * 2. 千位分隔符 * 3. 百分数 * 4. 正数 * 5. maxLength 截断 * 6. mask匹配(尾 0 补齐) */ function formatNumber(data, nullable, zeroDisplayAs0, mask, maxLength) { /** * 入参正确性检查 */ if (data != null && typeof data !== 'number') { throw new Error( 'formatNumber \u5165\u53C2 data \u53EA\u5141\u8BB8\u4F20\u5165\u3010null\u3001number\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' .concat(data, ', ') .concat((0, _typeof2.default)(data), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if (typeof nullable !== 'boolean') { throw new Error( 'formatNumber \u5165\u53C2 nullable \u53EA\u5141\u8BB8\u4F20\u5165\u3010boolean\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' .concat(nullable, ', ') .concat((0, _typeof2.default)(nullable), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if (typeof zeroDisplayAs0 !== 'boolean') { throw new Error( 'formatNumber \u5165\u53C2 zeroDisplayAs0 \u53EA\u5141\u8BB8\u4F20\u5165\u3010boolean\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' .concat(zeroDisplayAs0, ', ') .concat((0, _typeof2.default)(zeroDisplayAs0), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if (typeof mask !== 'string') { throw new Error( 'formatNumber \u5165\u53C2 mask \u53EA\u5141\u8BB8\u4F20\u5165\u3010string\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' .concat(mask, ', ') .concat((0, _typeof2.default)(mask), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if (typeof maxLength !== 'number') { throw new Error( 'formatNumber \u5165\u53C2 maxLength \u53EA\u5141\u8BB8\u4F20\u5165\u3010number\u3011\u7C7B\u578B\u503C\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' .concat(maxLength, ', ') .concat((0, _typeof2.default)(maxLength), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } if ((0, _typeof2.default)(maxLength) < -1) { throw new Error( 'formatNumber \u5165\u53C2 maxLength \u5E94\u8BE5\u662F >= -1 \u7684\u6574\u6570\uFF0C\u5B9E\u9645\u4F20\u5165\u3010' .concat(maxLength, ', ') .concat((0, _typeof2.default)(maxLength), '\u3011\uFF0C\u8BF7\u68C0\u67E5!') ); } // 1. 如果 data == null && nullable == true ==> "" // 2. 如果 data === 0 && zeroDisplayAs0 == false ==> "" if (data == null && nullable === true) { return ''; } // nullable === false 时, null 等价于 0 if (data == null && nullable === false) { data = 0; } if (data === 0 && zeroDisplayAs0 === false) { return ''; } // 3. 根据 mask 计算出需要保留几位小数 var decimalPartMaxLength = 0; var integerPartMaxLength = Number.MAX_SAFE_INTEGER; if (mask.indexOf('.') > -1) { var t = stripDelimiters(mask, '%'); t = t.split('.')[1]; decimalPartMaxLength = t.length; } if (maxLength > -1) { integerPartMaxLength = maxLength - decimalPartMaxLength; if (integerPartMaxLength <= 0) { throw new Error('你配置的 maxLength 有点小啊,整数部分都截没了...'); } } // MASK要求强制为正数 if (mask.indexOf('+') > -1) { data = Math.abs(data); } // 有百分数 var percentSign = null; if (mask.indexOf('%') > -1) { data = data * 100; percentSign = true; } // 四舍五入 var numRounded = _util.NumberUtil.round(data, decimalPartMaxLength); // 转换为字符串 var strRounded = String(numRounded); // 按 maxLength + mask 截断整数 var strIntegerPartCutted = strRounded; var _strRounded$split = strRounded.split('.'), _strRounded$split2 = (0, _slicedToArray2.default)(_strRounded$split, 2), integerPartMayIncludeMinusSign = _strRounded$split2[0], decimalPart = _strRounded$split2[1]; var integerPartDigits = stripDelimiters(integerPartMayIncludeMinusSign, '-'); // 截断整数的时候..别把负号给算进去 if (integerPartDigits.length > integerPartMaxLength) { strIntegerPartCutted = String( parseInt( Number(integerPartMayIncludeMinusSign) / Math.pow(10, integerPartDigits.length - integerPartMaxLength) ) ); if (decimalPart) { strIntegerPartCutted += '.' + decimalPart; } } // 补齐尾0 var arr = strIntegerPartCutted.split('.'); var strSubFixAdded = null; if (arr.length === 1) { strSubFixAdded = ''.concat(arr[0]); if (decimalPartMaxLength) { strSubFixAdded += '.'.concat(_lodash.default.padEnd('', decimalPartMaxLength, '0')); } } else if (arr.length === 2) { strSubFixAdded = ''.concat(arr[0], '.').concat(_lodash.default.padEnd(arr[1], decimalPartMaxLength, '0')); } else { throw new Error('不应该跑到这个地方...'); } // 增加千位分隔符 var thousandsSeparatorAdded = strSubFixAdded; if (mask.indexOf(',') > -1) { var _thousandsSeparatorAd = thousandsSeparatorAdded.split('.'), _thousandsSeparatorAd2 = (0, _slicedToArray2.default)(_thousandsSeparatorAd, 2), _integerPartMayIncludeMinusSign = _thousandsSeparatorAd2[0], _decimalPart = _thousandsSeparatorAd2[1]; var p = /(\d+)(\d{3})/; while (p.test(_integerPartMayIncludeMinusSign)) { _integerPartMayIncludeMinusSign = _integerPartMayIncludeMinusSign.replace(p, '$1' + ',' + '$2'); } thousandsSeparatorAdded = _integerPartMayIncludeMinusSign; if (_decimalPart) { thousandsSeparatorAdded += '.' + _decimalPart; } } if (percentSign) { return thousandsSeparatorAdded + '%'; } else { return thousandsSeparatorAdded; } } //@ sourceMappingURL=dataNormalizeHelper.js.map