Engee 文档
Notebook

CUSIP校验位验证算法

本示例介绍了Julia编程语言中CUSIP校验位算法的实现。 我们将看看代码是如何工作的以及它的用途。

导言

什么是CUSIP?

Cusip(统一证券识别程序委员会)是美国和加拿大用于识别股票和债券等金融工具的标准。 每个CUSIP由9个字符组成,其中最后9个字符是校验位,使用特定算法计算。

为什么我需要校验位?

校验位允许您检查CUSIP是否已正确输入或传输。 这有助于避免输入数据时出现错误,并提高使用金融工具的系统的可靠性。

CUSIP模块的结构

考虑代码:

In [ ]:
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
Out[0]:
Main.CUSIP

模块 CUSIP 封装与检查CUSIP代码相关的函数。 这很方便,以免堵塞全局命名空间。

功能 _lastdigitcusip 根据CUSIP的前8个字符计算校验位。

功能 checkdigit 检查第9个CUSIP字符是否与计算的校验位匹配。

算法如何工作:
  1. 字符串的每个字符都转换为数值:
    -从0到9的数字。
    -从a到Z的字母转换为从10到35的数字。
    -特殊字符有固定的含义。
  2. 如果符号的位置是偶数(计数),则其值乘以2。
  3. 所得值分为十和一,进行总结。
  4. 校验位是根据总金额计算的.

检查代码

In [ ]:
for code in ("037833100", "17275R102", "38259P508", "594918104", "68389X106", "68389X105")
    println("$code is ", CUSIP.checkdigit(code) ? "correct." : "not correct.")
end
037833100 is correct.
17275R102 is correct.
38259P508 is correct.
594918104 is correct.
68389X106 is not correct.
68389X105 is correct.

这里检查了几个CUSIP代码的正确性。 每个函数都被调用 checkdigit,并将结果显示出来。

结论

我们回顾了Julia语言中CUSIP校验位验证算法的实现。 分析了计算校验位和验证代码正确性的功能. 这对于使用数据准确性非常重要的金融工具的系统非常有用。 该实现演示了如何使用内置函数和逻辑结构在Julia中高效地处理字符串和数字。

该示例是使用[罗塞塔代码]的材料开发的(https://rosettacode.org/wiki/CUSIP