dareway-rui
Version:
244 lines (198 loc) • 8.05 kB
JavaScript
;
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