C# 如何在C语言中生成CUSIP校验位#
CUSIP是用于唯一标识金融证券的9位字母数字代码 它们是1964年发明的,考虑到60年代数据传输的可靠性,第9个数字实际上是一个校验数字,用于确认前8个字符的有效性。有时,甚至在今天,您可能会找到理由想要验证CUSIP,或者某个公司或服务令人讨厌地决定只传输8个字符的CUSIP,即使这违背了校验位的目的 生成校验位的步骤如下:C# 如何在C语言中生成CUSIP校验位#,c#,algorithm,financial,check-digit,C#,Algorithm,Financial,Check Digit,CUSIP是用于唯一标识金融证券的9位字母数字代码 它们是1964年发明的,考虑到60年代数据传输的可靠性,第9个数字实际上是一个校验数字,用于确认前8个字符的有效性。有时,甚至在今天,您可能会找到理由想要验证CUSIP,或者某个公司或服务令人讨厌地决定只传输8个字符的CUSIP,即使这违背了校验位的目的 生成校验位的步骤如下: 根据非数字数字在字母表中的顺序位置加9(A=10,B=11,…Z=35)将其转换为数值,并将字符*=36,@=37,#=38转换为数值 将每个偶数数字乘以2 如果乘法
在C#中获取该值的最佳/最简单的方法是什么?自动回答,因为我昨天在谷歌上搜索了这个值,想在那里节省一些时间。不过,我确实希望听到更多的答案或反馈
public string GenerateCheckDigit(string cusip)
{
int sum = 0;
char[] digits = cusip.ToUpper().ToCharArray();
string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ*@#";
for (int i = 0; i < digits.Length; i++)
{
int val;
if (!int.TryParse(digits[i].ToString(), out val))
val = alphabet.IndexOf(digits[i]) + 10;
if ((i % 2) != 0)
val *= 2;
val = (val % 10) + (val / 10);
sum += val;
}
int check = (10 - (sum % 10)) % 10;
return check.ToString();
}
public string generateCECKDIGIT(字符串cusip)
{
整数和=0;
char[]digits=cusip.ToUpper().ToCharArray();
字符串字母表=“abcdefghijklmnopqrstuvxyz*@#”;
对于(int i=0;i
编辑:
.NET Fiddle演示了这一点:如果预先计算校验位的值,并将其存储在查找表中,则校验位的计算将变得更加简单:
private static readonly int[,] Check = new int[128, 2];
static CusipCheckSum() {
var cusipChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ*@#";
for (var i = 0 ; i != cusipChars.Length ; i++) {
Check[cusipChars[i], 0] = i%10 + i/10;
Check[cusipChars[i], 1] = 2*i%10 + 2*i/10;
}
}
使用二维查找数组,您可以在一行代码中计算校验位:
var checkDigit = (10-(cusip.Select((ch, pos) => Check[ch, pos%2]).Sum()%10))%10;
这对我很有效。我还需要ISIN校验和验证,并为此在助手上编写了一个变体:我不知道C#如何处理除法,但更准确的版本应该是val=(val%10)+int(val/10);在C#中,结果将是一个int,因为我们用整型文字(10)除法。不过,对于那些希望在C#以外的语言中使用此算法的人来说,您的评论仍然是一个很好的澄清。我已经检查了此解决方案,并且在大量情况下,它的工作速度比公认答案中的解决方案快约2倍。我还在几个CUSIP上验证了正确性。