JavaScript/TypeScriptでJANコードを検証する
標準タイプでも短縮タイプでもOK
長さとチェックディジットの検証を行う
TypeScript実装
code:validate_jan.ts
function validateJanCode(barcode: string): boolean {
if (barcode.length !== 13 && barcode.length !== 8) {
return false;
}
const fullBarcode = barcode.padStart(13, '0');
let oddDigitSum = 0;
let evenDigitSum = 0;
for (let i = 0; i < fullBarcode.length - 1; i++) {
if (i % 2 === 0) {
oddDigitSum += parseInt(fullBarcodei); } else {
evenDigitSum += parseInt(fullBarcodei); }
}
const lastDigit = parseInt(String(evenDigitSum * 3 + oddDigitSum).slice(-1));
const expectCheckDigit = lastDigit === 0 ? 0 : 10 - lastDigit;
return expectCheckDigit === parseInt(fullBarcode.slice(-1));
}
テスト
code:validate-jan_test.ts
Deno.test('チェックディジットが正しい標準タイプJANコードでtrueを返す', () => {
assertEquals(validateJanCode('4569951116179'), true);
});
Deno.test('チェックディジットが間違った標準タイプJANコードでfalseを返す', () => {
assertEquals(validateJanCode('4569951116171'), false);
assertEquals(validateJanCode('4569951116172'), false);
assertEquals(validateJanCode('4569951116173'), false);
assertEquals(validateJanCode('4569951116174'), false);
assertEquals(validateJanCode('4569951116175'), false);
assertEquals(validateJanCode('4569951116176'), false);
assertEquals(validateJanCode('4569951116177'), false);
assertEquals(validateJanCode('45699511161778'), false);
});
Deno.test('チェックディジットが0場合に正しい標準タイプJANコードでtrueを返す', () => {
assertEquals(validateJanCode('4569951116100'), true);
});
Deno.test('チェックディジットが正しい短縮タイプJANコードでtrueを返す', () => {
assertEquals(validateJanCode('49968712'), true);
});
Deno.test('チェックディジットが間違った短縮タイプJANコードでfalseを返す', () => {
assertEquals(validateJanCode('49968711'), false);
assertEquals(validateJanCode('49968713'), false);
assertEquals(validateJanCode('49968714'), false);
assertEquals(validateJanCode('49968715'), false);
assertEquals(validateJanCode('49968716'), false);
assertEquals(validateJanCode('49968717'), false);
assertEquals(validateJanCode('49968718'), false);
assertEquals(validateJanCode('49968719'), false);
});
Deno.test('チェックディジットが0の場合に正しい短縮タイプJANコードでtrueを返す', () => {
assertEquals(validateJanCode('49968750'), true);
});
Deno.test('長さが間違ったJANコードでfalseを返す', () => {
assertEquals(validateJanCode('4996871'), false);
});
参考