34 lines
790 B
Plaintext
34 lines
790 B
Plaintext
module CUSIP
|
|
|
|
function _lastdigitcusip(input::AbstractString)
|
|
input = uppercase(input)
|
|
s = 0
|
|
|
|
for (i, c) in enumerate(input)
|
|
if isdigit(c)
|
|
v = Int(c) - 48
|
|
elseif isalpha(c)
|
|
v = Int(c) - 64 + 9
|
|
elseif c == '*'
|
|
v = 36
|
|
elseif c == '@'
|
|
v = 37
|
|
elseif c == '#'
|
|
v = 38
|
|
end
|
|
|
|
if iseven(i); v *= 2 end
|
|
s += div(v, 10) + rem(v, 10)
|
|
end
|
|
|
|
return Char(rem(10 - rem(s, 10), 10) + 48)
|
|
end
|
|
|
|
checkdigit(input::AbstractString) = input[9] == _lastdigitcusip(input[1:8])
|
|
|
|
end # module CUSIP
|
|
|
|
for code in ("037833100", "17275R102", "38259P508", "594918104", "68389X106", "68389X105")
|
|
println("$code is ", CUSIP.checkdigit(code) ? "correct." : "not correct.")
|
|
end
|