CUSIP
Алгоритм проверки контрольной цифры CUSIP
В этом примере рассматривается реализация алгоритма проверки контрольной цифры CUSIP на языке программирования Julia. Мы разберём, как работает код, и для чего он нужен.
Введение
Что такое CUSIP?
CUSIP (Committee on Uniform Securities Identification Procedures) — это стандарт, используемый в США и Канаде для идентификации финансовых инструментов, таких как акции и облигации. Каждый CUSIP состоит из 9 символов, где последние 9-й символ — это контрольная цифра, которая вычисляется по определённому алгоритму.
Зачем нужна контрольная цифра?
Контрольная цифра позволяет проверить, правильно ли введён или передан CUSIP. Это помогает избежать ошибок при вводе данных и повышает надёжность систем, работающих с финансовыми инструментами.
Структура модуля CUSIP
Рассмотрим код:
module CUSIP
function _lastdigitcusip(input::AbstractString)
input = uppercase(input) # Приводим строку к верхнему регистру
s = 0 # Переменная для накопления суммы
for (i, c) in enumerate(input) # Проходим по каждому символу строки с индексом
if isdigit(c)
v = Int(c) - 48 # Цифры: '0'-'9' -> 0-9
elseif isletter(c)
v = Int(c) - 64 + 9 # Буквы: 'A'-'Z' -> 10-35, затем +9
elseif c == '*'
v = 36 # Специальный символ
elseif c == '@'
v = 37 # Специальный символ
elseif c == '#'
v = 38 # Специальный символ
end
if iseven(i); v *= 2 end # Если позиция чётная, умножаем на 2
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
Модуль CUSIP
инкапсулирует функции, связанные с проверкой CUSIP-кодов. Это удобно, чтобы не засорять глобальное пространство имён.
Функция _lastdigitcusip
вычисляет контрольную цифру по первым 8 символам CUSIP.
Функция checkdigit
проверяет, совпадает ли 9-й символ CUSIP с вычисленной контрольной цифрой.
Как работает алгоритм:
- Каждый символ строки преобразуется в числовое значение:
- Цифры от 0 до 9.
- Буквы от A до Z преобразуются в числа от 10 до 35.
- Специальные символы имеют фиксированные значения.
- Если позиция символа чётная (по счёту), его значение умножается на 2.
- Полученное значение разбивается на десятки и единицы, которые суммируются.
- По итоговой сумме вычисляется контрольная цифра.
Проверка кодов
for code in ("037833100", "17275R102", "38259P508", "594918104", "68389X106", "68389X105")
println("$code is ", CUSIP.checkdigit(code) ? "correct." : "not correct.")
end
Здесь проверяется несколько CUSIP-кодов на корректность. Для каждого вызывается функция checkdigit
, и выводится результат.
Заключение
Мы рассмотрели реализацию алгоритма проверки контрольной цифры CUSIP на языке Julia. Были разобраны функции вычисления контрольной цифры и проверки корректности кода. Это полезно для систем, работающих с финансовыми инструментами, где важна точность данных. Реализация показывает, как можно эффективно работать со строками и числами в Julia, используя встроенные функции и логические конструкции.
Пример разработан с использованием материалов Rosetta Code