首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何生成CUSIP检查数字

如何生成CUSIP检查数字
EN

Stack Overflow用户
提问于 2014-03-06 17:08:55
回答 3查看 11.4K关注 0票数 5

CUSIP是一种9位字母数字代码,用于唯一地识别金融安全。

https://en.wikipedia.org/wiki/CUSIP

它们是1964年发明的,鉴于60年代数据传输的可靠性,第9位实际上是用来确认前8个字符有效性的校验数字。有时,甚至在今天,你也会发现有理由想要验证一个CUSIP,或者某个公司或服务会不耐烦地决定只传输8个字符的CUSIP,即使这不符合检查数字的目的。

生成支票数字的过程是:

  1. 根据字母加9 (A=10、B=11、...Z=35)中的序号位置将非数字数字转换为值,并转换字符*=36、@=37、#=38。
  2. 将每一个偶数乘以2
  3. 如果乘法的结果是一个两位数,那么把这些数字加在一起.(12 =1+2= 3)
  4. 得到所有值的和。
  5. 得到此操作的泛泛值:(10 -(和模10))模10。

在C#中获取此值的最佳/最简单方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-06 17:08:55

代码语言:javascript
复制
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();
}

编辑:

.NET Fiddle演示了这一点:https://dotnetfiddle.net/kspQWl

票数 12
EN

Stack Overflow用户

发布于 2015-11-11 16:11:09

如果预先计算检查数字的值,并将其存储在查找表中,则检查数字的计算将变得更加简单:

代码语言:javascript
复制
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;
    }
}

在2D查找数组就位后,可以在一行代码中计算检查数字:

代码语言:javascript
复制
var checkDigit = (10-(cusip.Select((ch, pos) => Check[ch, pos%2]).Sum()%10))%10;
票数 5
EN

Stack Overflow用户

发布于 2021-12-13 08:27:11

我看到java没有algo,所以也添加了它:

代码语言:javascript
复制
String generateCusipCheckDigit(String cusip) {
        final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ*@#";
        int sum = 0;
        int value = 0;
        char[] cusipChars = cusip.toUpperCase().toCharArray();

        for (int i = 0; i < cusipChars.length; i++) {
            char actualChar = cusipChars[i];
            if (Character.isDigit(actualChar)) {
                value = Integer.parseInt(String.valueOf(actualChar));
            } else if (Character.isAlphabetic(actualChar)){
                value = alphabet.indexOf(actualChar) + 10;
            } else if (cusipChars[i] == '*'){
                value = 36;
            } else if (cusipChars[i] == '@'){
                value = 37;
            } else if (cusipChars[i] == '#'){
                value = 38;
            }

            if ((i % 2) != 0){
                value *= 2;
            }
            value = (value % 10) + (value / 10);
            sum += value;
        }
        int check = (10 - (sum % 10)) % 10;

        return String.valueOf(check);
    }

还有一些测试:

代码语言:javascript
复制
    @Test
    void checkDigitTest1(){
        String actual = generator.generateCusipCheckDigit("925524BF");

        Assertions.assertEquals("6", actual);
    }

    @Test
    void checkDigitTest2(){
        String actual = generator.generateCusipCheckDigit("90284B96");

        Assertions.assertEquals("2", actual);
    }

    @Test
    void checkDigitTest3(){
        String actual = generator.generateCusipCheckDigit("90284B97");

        Assertions.assertEquals("0", actual);
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22231257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档