チェックデジット プログラミング
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); } } }