C# 如何在C语言中生成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 如果乘法

CUSIP是用于唯一标识金融证券的9位字母数字代码

它们是1964年发明的,考虑到60年代数据传输的可靠性,第9个数字实际上是一个校验数字,用于确认前8个字符的有效性。有时,甚至在今天,您可能会找到理由想要验证CUSIP,或者某个公司或服务令人讨厌地决定只传输8个字符的CUSIP,即使这违背了校验位的目的

生成校验位的步骤如下:

  • 根据非数字数字在字母表中的顺序位置加9(A=10,B=11,…Z=35)将其转换为数值,并将字符*=36,@=37,#=38转换为数值

  • 将每个偶数数字乘以2

  • 如果乘法的结果是两位数,则将两位数相加。(12=1+2=3)

  • 获取所有值的总和

  • 获取此操作的下限值:(10-(求和模10))模10


  • 在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上验证了正确性。