4

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. 掛け算の結果が 2 桁の数字の場合は、それらの数字を足し合わせます。(12 = 1 + 2 = 3)

  4. すべての値の合計を取得します。

  5. この演算の下限値を取得します: (10 - ( sum modulo 10)) modulo 10.

C#でこの値を取得する最良/最も簡単な方法は何ですか?

4

3 に答える 3

11

私は昨日これをグーグルで調べていて、誰かを救いたいと思っていたので、自問自答します。もっと多くの回答やフィードバックを聞きたいです。

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

于 2014-03-06T17:08:55.437 に答える