ISBNコード(ISBN-13)のチェックディジットを計算する

Wikipedia のチェックディジット解説をまんまベタ実装。

ISBN - Wikipedia

このくらい平坦な方が個人的には分かりやすいかな。

ググれば其処彼処、至る所で様々な言語用のサンプルが
ゴロゴロしているのだが、折角書いたことだし此処で供養しておこう。


ISBN-13チェックディジット計算.vbs

Option Explicit

Dim input

input = InputBox("ISBN12~13桁を入力してください", "ISBN-13チェックディジット計算")
If input = "" Then WScript.Quit
WScript.Echo "ISBN: " & input & vbCrLf & "チェックディジット: " & CalcCheckDigit10_3_1(input)


'指定した数字12桁または13桁の文字列に対するチェックディジットを返す
'(モジュラス10 ウェイト3・1)。
'指定した文字列に誤りがあった場合は空文字を返す
Function CalcCheckDigit10_3_1(isbn12_13)
    '指定した文字列が数字12桁または13桁の文字列であるか確認
    Dim RE
    Set RE = CreateObject("VBScript.RegExp")
    RE.Pattern = "^[0-9]{12,13}$"
    RE.Global = True
    
    '指定した文字列に誤りがあった場合は空文字を返す
    If Not RE.Test(isbn12_13) Then
        CalcCheckDigit10_3_1 = ""
        Set RE = Nothing
        Exit Function
    End If
    Set RE = Nothing
    
    '現行規格のISBN (ISBN-13) のチェックディジット計算(Wikipedia参照)
    
    Const MODULUS = 10
    Const WAIT_ODD = 1
    Const WAIT_EVEN = 3
    
    Dim temp
    Dim sum
    Dim remainder
    Dim ret
    
    Dim index
    For index = 0 To 11
        'チェックディジットを除いた一番左側の桁から順に1、3、1、3…を掛けてそれらの和を取る。
        If ((index + 1) Mod 2) <> 0 Then
            temp = (CInt(Mid(isbn12_13, index + 1, 1)) * WAIT_ODD)
        Else
            temp = (CInt(Mid(isbn12_13, index + 1, 1)) * WAIT_EVEN)
        End If
        sum = sum + temp
    Next
    '和を10で割る
    remainder = sum Mod MODULUS
    
    '和を10で割って出た、余りの下1桁が0の場合はチェック数字を0とする。
    If (remainder Mod 10) = 0 Then
        ret = 0
    Else
        '和を10で割って出た、余りを10から引く。
        ret = MODULUS - remainder
    End If
    
    CalcCheckDigit10_3_1 = CStr(ret)
End Function