@e-group/utils
Version:
eGroup team utils that share across projects.
99 lines (74 loc) • 2.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isResidentPermitId = exports.isTwId = exports.isResidentPermitIdFormatValid = exports.isTwIdFormatValid = void 0;
const isTwIdFormatValid = id => /^[A-Z][1,2,8,9]\d{8}$/.test(id);
exports.isTwIdFormatValid = isTwIdFormatValid;
const isResidentPermitIdFormatValid = id => /^[A-Z][A,B,C,D]\d{8}$/.test(id);
/**
* 把對應的英文字母轉換成二位數字
*/
exports.isResidentPermitIdFormatValid = isResidentPermitIdFormatValid;
const parseLetterToNumber = letter => {
const letters = 'ABCDEFGHJKLMNPQRSTUVXYWZIO';
return letters.indexOf(letter) + 10;
};
/**
* 取得第一個字母的加權值
*/
const getFirstValue = letter => {
// 第一碼英文字母轉換為二位數字碼
const firstNumber = parseLetterToNumber(letter); // 轉換型態方便待會拆數字
const firstNumberString = String(firstNumber); // 第一個字母的加權值
return Number(firstNumberString.charAt(0)) * 1 + Number(firstNumberString.charAt(1)) * 9;
};
/**
* 取得後面 8 碼(扣除驗證碼)的加權值
*/
const getSum = others => {
let sum = 0; // 權重由 8 開始遞減至 1
let weight = 8;
for (let i = 0; i < others.length; i++) {
const number = Number(others[i]);
sum += number * weight;
weight--;
}
return sum;
};
/**
* 驗證檢查碼是否正確
* 由模數減去餘數得檢查號碼,若餘數為 0 時,則設定其檢查碼為 0
*/
const checkNumberIsValid = (remainder, checkNumber) => {
if (remainder === 0) {
return checkNumber === 0;
}
return checkNumber === 10 - remainder;
};
/**
* 身分證字號規則 http://web.fg.tp.edu.tw/~anny/idtest.htm
*/
const isTwId = id => {
if (!isTwIdFormatValid(id)) return false;
const firstValue = getFirstValue(id[0]);
const idTailSum = getSum(Array.from(id.slice(1, 9)));
const remainder = (firstValue + idTailSum) % 10;
const checkNumber = Number(id.slice(-1));
return checkNumberIsValid(remainder, checkNumber);
};
/**
* 居留證號碼規則 http://web.fg.tp.edu.tw/~anny/idtest.htm
*/
exports.isTwId = isTwId;
const isResidentPermitId = id => {
if (!isResidentPermitIdFormatValid(id)) return false;
const firstValue = getFirstValue(id[0]);
const secondNumberString = String(parseLetterToNumber(id[1]));
const secondNumber = secondNumberString.charAt(1);
const idTailSum = getSum([secondNumber, ...Array.from(id.slice(2, 9))]);
const remainder = (firstValue + idTailSum) % 10;
const checkNumber = Number(id.slice(-1));
return checkNumberIsValid(remainder, checkNumber);
};
exports.isResidentPermitId = isResidentPermitId;