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]:
模块 CUSIP 封装与检查CUSIP代码相关的函数。 这很方便,以免堵塞全局命名空间。
功能 _lastdigitcusip 根据CUSIP的前8个字符计算校验位。
功能 checkdigit 检查第9个CUSIP字符是否与计算的校验位匹配。
算法如何工作:
- 字符串的每个字符都转换为数值:
-从0到9的数字。
-从a到Z的字母转换为从10到35的数字。
-特殊字符有固定的含义。 - 如果符号的位置是偶数(计数),则其值乘以2。
- 所得值分为十和一,进行总结。
- 校验位是根据总金额计算的.
检查代码
In [ ]:
for code in ("037833100", "17275R102", "38259P508", "594918104", "68389X106", "68389X105")
println("$code is ", CUSIP.checkdigit(code) ? "correct." : "not correct.")
end
这里检查了几个CUSIP代码的正确性。 每个函数都被调用 checkdigit,并将结果显示出来。
结论
我们回顾了Julia语言中CUSIP校验位验证算法的实现。 分析了计算校验位和验证代码正确性的功能. 这对于使用数据准确性非常重要的金融工具的系统非常有用。 该实现演示了如何使用内置函数和逻辑结构在Julia中高效地处理字符串和数字。
该示例是使用[罗塞塔代码]的材料开发的(https://rosettacode.org/wiki/CUSIP )