チェックデジット プログラミング

qiita.com

qiita.com

qiita.com

 

C#でマイナンバーのチェックデジットを計算する - Qiita

のコードを動かして見ましたが、

 

文字列を判定

12文字か?

12文字でなければ、falseを返す。

 

反転した文字列を判定

 

んで、なんかの数式で判定する?

 

地味に気になったのが、自分の環境だと、

WriteLineとかにConsoleを省略して記述されてるんだよなぁ・・・

 

考えられるのが上のバージョンのVisualStudioだと、

ある程度どうにかしてくれるとか?

 

数式とか見ればコードに置き換えられるようになりたいなぁ・・・

 

 

 

namespace ValidateMyNumber
{
    class Program
    {
        static void Main(string[] args)
        {
            WriteLine(ValidateMyNumber("123456789010")); //=>False
            WriteLine(ValidateMyNumber("123456789011")); //=>False
            WriteLine(ValidateMyNumber("123456789012")); //=>False
            WriteLine(ValidateMyNumber("123456789013")); //=>False
            WriteLine(ValidateMyNumber("123456789014")); //=>False
            WriteLine(ValidateMyNumber("123456789015")); //=>False
            WriteLine(ValidateMyNumber("123456789016")); //=>False
            WriteLine(ValidateMyNumber("123456789017")); //=>False
            WriteLine(ValidateMyNumber("123456789018")); //=>True
            WriteLine(ValidateMyNumber("123456789019")); //=>False
            WriteLine(ValidateMyNumber("023456789013")); //=>True

            ReadLine();
        }

        public static bool ValidateMyNumber(string mynumber)
        {
            //12文字でなければ偽
            if (mynumber.Length != 12)
                return false;

            //整数の列挙にして逆転
            var digits = mynumber.Select(e => e - '0').Reverse();

            //(↑で逆転しているので)最初の数字がチェックデジット
            var checkDigit = digits.First();

            var reminder = digits //整数の列挙を
                .Skip(1) //最初のチェックデジットは読み飛ばして
                .Select((e, i) => { var p = e; var q = i <= 5 ? i + 2 : i - 4; return p * q; }) // PとQを計算して積を求めて
                .Sum() % 11; // 合計を求めて11で割った商を出す

            return checkDigit == (reminder == 0 || reminder == 1 ? 0 : 11 - reminder);
        }
    }
}