またしても Wikipedia の ISBN ページを参考に実装。
2006年いっぱいで廃止のハズの規格だが、
天下のアマゾンが今だ使い続けるもんだから…
置いといたら少しは需要とか有るかしら?
書く言う自分も少し前、
ちょっとしたアマゾン用ツールを作った際、
必要に迫られて組んだって感じなんで。
ISBN-10チェックディジット計算.vbs
Option Explicit Dim input input = InputBox("ISBN9~10桁を入力してください", "ISBN-10チェックディジット計算") If input = "" Then WScript.Quit WScript.Echo "ISBN: " & input & vbCrLf & "チェックディジット: " & CalcCheckDigit11_10_2(input) '指定した数字9桁か10桁、または10桁目が「X」の文字列に対するチェックディジットを返す '(モジュラス11 ウェイト10-2)。 '指定した文字列に誤りがあった場合は空文字を返す Function CalcCheckDigit11_10_2(isbn9_10) '指定した文字列が数字9桁か10桁、10桁目が「X」の文字列であるか確認 Dim RE Set RE = CreateObject("VBScript.RegExp") RE.Pattern = "^([0-9]{9}|[0-9]{9}[0-9xX]{1})$" RE.Global = True '指定した文字列に誤りがあった場合は空文字を返す If Not RE.Test(isbn9_10) Then CalcCheckDigit11_10_2 = "" Set RE = Nothing Exit Function End If Set RE = Nothing '旧規格のISBN(ISBN-10)のチェックディジット計算(Wikipedia参照) Const MODULUS = 11 Const WAIT = 10 Dim temp Dim sum Dim remainder Dim ret Dim index 'チェックディジットを除いた左側の桁から10、9、8…2を掛けてそれらの和を取る。 sum = 0 For index = 0 To 8 temp = (CInt(Mid(isbn9_10, index + 1, 1)) * (WAIT - index)) sum = sum + temp Next '和を11で割って出た余りを11から引く remainder = sum Mod MODULUS ret = MODULUS - remainder 'なお、計算結果が10になった場合、10の代わりにX(アルファベットの大文字)を用いる。 If ret = WAIT Then CalcCheckDigit11_10_2 = "X" 'また、11になった場合は、0となる。 ElseIf ret = MODULUS Then CalcCheckDigit11_10_2 = "0" 'それ以外になった場合は、チェックディジットは計算結果の値となる Else CalcCheckDigit11_10_2 = CStr(ret) End If End Function