我想重新格式化并验证用户是否提供了一个有效的比利时企业号码,因为输入可能是以下几个例子之一:
- BE 0123.321.123
- BE0123.321.123
- BE0123 321 123
- 0123.321.123
- 123.321.123
- 123321123
我已经编写了一个函数,用于验证和重新格式化输入为“显示”版本(BE 0123.123.123)和“代码”版本(123123123)。此函数如下所示。
formatAndValidateEnterpriseNumber = enterpriseNumber => {
if(enterpriseNumber === undefined || !enterpriseNumber || (enterpriseNumber || '').length < 3) return { isValid: false, error: 'Please fill in your enterprise number' };
//Remove space, dots, ...
enterpriseNumber = enterpriseNumber.toUpperCase();
enterpriseNumber = enterpriseNumber.replace(/[. ,:-]+/g, '');
//Check for double country code
const reDouble = /^[a-zA-Z]{4}/;
if (reDouble.test(enterpriseNumber)) enterpriseNumber = enterpriseNumber.substring(2);
if (enterpriseNumber.length < 9 || enterpriseNumber.length > 12) return { isValid: false, error: 'The length of the provided number is incorrect' };
//Check country code
const reBE = /^[a-zA-Z]{2}/;
if (reBE.test(enterpriseNumber)) {
//Check if country code = BE
if (enterpriseNumber.slice(0, 2) !== 'BE') return { isValid: false, error: 'Please fill in a Belgian enterprise number' };
// Remove country code
else enterpriseNumber = enterpriseNumber.substring(2);
}
//Check if first digit is 0
if (enterpriseNumber.length === 10 && enterpriseNumber.startsWith('0')) enterpriseNumber = enterpriseNumber.substring(1);
//Check if enterpriseNumber is valid with modulo test
if (parseInt(97 - (enterpriseNumber.slice(0, 7) % 97), 10) !== parseInt(enterpriseNumber.slice(7, 9), 10))
return { isValid: false, error: 'The provided number is invalid'}
return {
isValid: true,
enterpriseNumber: enterpriseNumber,
displayEnterpriseNumber: `BE 0${enterpriseNumber.substring(0, 3)}.${enterpriseNumber.substring(3, 6)}.${enterpriseNumber.substring(6, 9)}`
};
};
我认为这很混乱,想知道是否可以通过一个/两个正则表达式测试来重新格式化和验证用户的输入以改进它?
第二个问题:有时候对于账户或信用卡号码,输入框中已经包含了下划线和横线(-),并在输入时重新格式化数字。这种方法叫什么名字?是否可以针对比利时企业号码这样的特定事物进行操作?