dareway-rui
Version:
441 lines (374 loc) • 15.3 kB
JavaScript
;
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