UNPKG

dareway-rui

Version:

244 lines (198 loc) 8.05 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); exports.default = deleteInValidMaskChar; function getDelimiterREByDelimiter(delimiter) { return new RegExp(delimiter.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'), 'g'); } function stripDelimiters(value, delimiters) { if (delimiters instanceof Array) { // multiple delimiters delimiters.forEach(function(current) { value = value.replace(getDelimiterREByDelimiter(current), ''); }); return value; } else { // single delimiter var delimiterRE = delimiters ? getDelimiterREByDelimiter(delimiters) : ''; return value.replace(delimiterRE, ''); } } function deleteInValidMaskChar(value, mask) { var maxLength = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1; if (!mask) { throw new Error('deleteInNumberChar入参【mask】不能为空!请检查!'); } checkMaskValid(mask); value = String(value); if (value === null || typeof value === 'undefined' || value === '') { value = ''; } var tempValue = String(value); var result = ''; //处理mask为百分比的情况 var isPercentMask = mask.indexOf('%') > -1 ? true : false; //mask是否包含% /*** * 1、百分比mask,且value中携带%,遍历value格式化之前去除% * 2、百分比mask,且value中不携带%(可能是在input中操作的时候,把百分比删除掉了) */ //遍历value有效值时,不携带% tempValue = stripDelimiters(tempValue, '%'); var isPointAllow = mask.indexOf('.') > -1 ? true : false; //是否允许输入小数点 var isPointExist = false; //小数点是否已存在 var isMinusSignAllow = mask.indexOf('+') > -1 ? false : true; var isMinusSignExist = false; //减号是否已存在 var decimalCount = 0; //允许的小数位数 var currentDecimalCount = 0; //当前已有的小数位数 var currentIntergCount = 0; //当前已有的整数位数 //计算小数位数 if (isPointAllow) { var decimalIndex = mask.indexOf('.'); var decimalMask = mask.substring(decimalIndex + 1); decimalMask = stripDelimiters(decimalMask, '%'); decimalCount = decimalMask.length; } //计算包含小数点时,真正的maxLenth var intergerMaxLength = -1; //整数最大长度 var decimalMaxlength = -1; //小数最大长度 if (mask.indexOf('.') !== -1 && maxLength != -1) { //有小数位数时,maxLength的值必须大于mask中小数位数的长度 if (decimalCount >= maxLength) { throw new Error( '\u5F53\u524DmaxLength\u503C\u4E3A\u3010' .concat(maxLength, '\u3011,\u6839\u636Emask\u3010') .concat(mask, '\u3011\u503C\uFF0C\u5C0F\u6570\u90E8\u5206\u6709\u3010') .concat( decimalCount, '\u3011\u4F4D\uFF0Cmask\u4E0EmaxLength\u51B2\u7A81\uFF0C\u8BF7\u68C0\u67E5\uFF01' ) ); } else { decimalMaxlength = decimalCount; intergerMaxLength = maxLength - decimalCount; } } else if (mask.indexOf('.') == -1 && maxLength != -1) { decimalMaxlength = -1; intergerMaxLength = maxLength; } for (var i = 0; i < tempValue.length; i++) { var temp = tempValue[i]; //当前字符是 ‘.’ if (temp === '.') { if (!isPointAllow) { // 不允许小数点 但是输入小数点,直接忽略 continue; } //允许小数点 但是小数点已经存在,这一个忽略 if (isPointExist) { continue; } //允许小数点 小数点不存在,继续遍历 result += temp; isPointExist = true; continue; } ////当前字符是 ‘-’ if (temp === '-') { // 不允许输入负值 但是输入负号,直接忽略 if (!isMinusSignAllow) { continue; } //允许输入负值 但是负值已经存在,直接忽略 if (isMinusSignExist) { continue; } //负号一直放到最前边。。 isMinusSignExist = true; continue; } //其他情况 var numberTemp = Number(temp); if (isNaN(numberTemp)) { break; } //判断小数位数是否已经超出 if (isPointAllow) { if (isPointExist) { //已经到小数部分 if (currentDecimalCount == decimalCount) { continue; } else if (currentDecimalCount < decimalCount) { currentDecimalCount += 1; } } else { //处理整数部分 //截断 。。多输入的整数部分的数字 不显示 if (currentIntergCount == intergerMaxLength) { continue; } else if (currentIntergCount < intergerMaxLength) { currentIntergCount += 1; } } } else { if (currentIntergCount == intergerMaxLength) { continue; } else if (currentIntergCount < intergerMaxLength) { currentIntergCount += 1; } } result += temp; } //第一个数字是0 不显示 if (result.length > 1 && result.charAt(0) == '0' && !isPointExist) { result = result.substring(1); } //负号存在 拼接放到最前边 if (isMinusSignExist) { result = '-' + result; } if (isPercentMask) { result += '%'; } return result; } function checkMaskValid(mask) { //校验Mask合法性 var maskLen = mask.length, charValue = null, _mask = null, lastDotIndex = null, _maskLen = null; for (var i = 0; i < maskLen; i++) { charValue = mask.substr(i, 1); if ( charValue !== '#' && charValue !== '0' && charValue !== ',' && charValue !== '.' && charValue !== '%' && charValue !== '+' ) { throw new Error( '输入的Mask值【' + mask + '】含有不正确的字符【' + charValue + '】,可包含的字符包括【#】【0】【,】【.】【%】【+】,请检查!' ); } } if (mask.indexOf('+') !== -1 && mask.indexOf('+') !== 0) { throw new Error('输入的Mask值【' + mask + '】中【+】的位置不正确,【+】号应该在第一位,请检查!'); } if (mask.indexOf('%') !== -1 && mask.substring(mask.length - 1) !== '%') { throw new Error( '\u8F93\u5165\u7684Mask\u503C\u3010'.concat( mask, '\u3011,\u5F53mask\u4E2D\u5305\u542B%\u65F6\uFF0C%\u5FC5\u987B\u5728\u6700\u540E\uFF0C\u8BF7\u68C0\u67E5\uFF01' ) ); } if (mask.indexOf('%') !== -1) { mask = mask.slice(0, -1); } if (mask.indexOf('.') != -1) { _mask = mask.split('.')[0]; } else { _mask = mask; } while (_mask.indexOf(',') != -1) { _maskLen = _mask.length; lastDotIndex = _mask.lastIndexOf(','); if ((_maskLen - lastDotIndex - 1) % 3 !== 0) { throw new Error('输入的Mask值【' + mask + '】中【,】的位置非法,请检查!'); return ''; } _mask = _mask.substr(0, lastDotIndex); } } //@ sourceMappingURL=deleteInValidMaskChar.js.map