예제 #1
0
파일: CValid.cs 프로젝트: doctorgu/MadeIn9
        /// <summary>
        /// 주민등록번호가 올바른 형식인 지 확인함.
        /// </summary>
        /// <param name="Value">확인할 주민번호</param>
        /// <param name="ErrMsgIs">리턴값이 false일 때 설정되는 에러 메세지</param>
        /// <example>
        /// string ErrMsgIs;
        ///
        /// if (!IsJumin("710131-1121513", out ErrMsgIs))
        /// {
        ///     Console.WriteLine(ErrMsgIs);
        /// }
        /// else
        /// {
        ///     Console.WriteLine("올바른 주민번호입니다");
        /// }
        /// </example>
        public static bool IsJumin(string Value, bool IsCheckDigit, out string ErrMsgIs)
        {
            ErrMsgIs = "";

            int PosDash = Value.IndexOf('-');

            if (PosDash != -1)
            {
                Value = Value.Substring(0, PosDash) + Value.Substring(PosDash + 1);
            }

            if (!CValid.IsDigit(Value))
            {
                ErrMsgIs = "주민등록번호는 숫자만 가능합니다.";
                return(false);
            }

            if (Value.Length != 13)
            {
                ErrMsgIs = "주민등록번호는 13자리여야만 합니다.";
                return(false);
            }

            string DateCheck = Value.Substring(0, 2)
                               + "-" + Value.Substring(2, 2)
                               + "-" + Value.Substring(4, 2);

            if (!CValid.IsDateTime(DateCheck))
            {
                ErrMsgIs = "주민등록번호의 생년월일 부분은 날짜 형식이어야만 합니다.";
                return(false);
            }

            int Sex = Convert.ToInt32(Value.Substring(6, 1));

            if ((Sex < 1) || (Sex > 4))
            {
                ErrMsgIs = "주민등록번호의 두번째 부분의 첫번째 자리는 성별을"
                           + " 나타내므로 1, 2, 3, 4만 가능합니다.";
                return(false);
            }

            if (IsCheckDigit)
            {
                /*
                 * 다음과 같은 방법으로 주민 번호의 마지막 번호가 만들어짐.
                 * 1. 각 문자열에 2부터 1씩 증가시켜 9까지 순서대로 더함.
                 * 2. 이 값들을 모두 더함.
                 * 3. 모두 더한 값에서 11로 나눈 나머지 값을 구함.
                 * 4. 11에서 그 나머지 값을 뺀 뒤, 그것을 10으로 나눈 나머지 값을 구함.
                 */
                int SumOfNum = (Convert.ToInt32(Convert.ToString(Value[0])) * 2)
                               + (Convert.ToInt32(Convert.ToString(Value[1])) * 3)
                               + (Convert.ToInt32(Convert.ToString(Value[2])) * 4)
                               + (Convert.ToInt32(Convert.ToString(Value[3])) * 5)
                               + (Convert.ToInt32(Convert.ToString(Value[4])) * 6)
                               + (Convert.ToInt32(Convert.ToString(Value[5])) * 7)
                               + (Convert.ToInt32(Convert.ToString(Value[6])) * 8)
                               + (Convert.ToInt32(Convert.ToString(Value[7])) * 9)
                               + (Convert.ToInt32(Convert.ToString(Value[8])) * 2)
                               + (Convert.ToInt32(Convert.ToString(Value[9])) * 3)
                               + (Convert.ToInt32(Convert.ToString(Value[10])) * 4)
                               + (Convert.ToInt32(Convert.ToString(Value[11])) * 5);

                int CheckDigit = (11 - (SumOfNum % 11)) % 10;
                if (Convert.ToInt32(Value.Substring(12, 1)) != CheckDigit)
                {
                    ErrMsgIs = "올바른 형식의 주민등록번호가 아닙니다.";
                    return(false);
                }
            }

            return(true);
        }
예제 #2
0
파일: CValid.cs 프로젝트: doctorgu/MadeIn9
        /// <summary>
        /// 주민번호의 체크디지트를 생성함.
        /// </summary>
        /// <param name="YYMMDD">YYMMDD 형식의 년월일</param>
        /// <param name="SixDigit">두번째 부분의 여섯자리</param>
        /// <param name="ErrMsgIs">리턴값이 ""일 때 설정되는 에러 메세지</param>
        /// <example>
        /// string ErrMsgIs;
        ///
        /// Console.WriteLine(GenerateJuminNo("710131", "999999", out ErrMsgIs)); //""
        /// Console.WriteLine(GenerateJuminNo("710131", "abcdef", out ErrMsgIs)); //""
        /// Console.WriteLine(GenerateJuminNo("710131", "111111", out ErrMsgIs)); //0
        /// Console.WriteLine(GenerateJuminNo("710131", "112151", out ErrMsgIs)); //3
        /// </example>
        public static string GenerateJuminNo(string YYMMDD, string SixDigit,
                                             out string ErrMsgIs)
        {
            ErrMsgIs = "";

            string Value = YYMMDD + SixDigit;

            if (!CValid.IsDigit(Value))
            {
                ErrMsgIs = "주민등록번호는 숫자만 가능합니다.";
                return("");
            }

            if (Value.Length != 12)
            {
                ErrMsgIs = "마지막 숫자를 제외한 주민등록번호는 12자리여야만 합니다.";
                return("");
            }

            string DateCheck = Value.Substring(0, 2)
                               + "-" + Value.Substring(2, 2)
                               + "-" + Value.Substring(4, 2);

            if (!CValid.IsDateTime(DateCheck))
            {
                ErrMsgIs = "주민등록번호의 생년월일 부분은 날짜 형식이어야만 합니다.";
                return("");
            }

            int Sex = Convert.ToInt32(Value.Substring(6, 1));

            if ((Sex < 1) || (Sex > 4))
            {
                ErrMsgIs = "주민등록번호의 두번째 부분의 첫번째 자리는 성별을"
                           + " 나타내므로 1, 2, 3, 4만 가능합니다.";
                return("");
            }

            /*
             * 다음과 같은 방법으로 주민 번호의 마지막 번호가 만들어짐.
             * 1. 각 문자열에 2부터 1씩 증가시켜 9까지 순서대로 더함.
             * 2. 이 값들을 모두 더함.
             * 3. 모두 더한 값에서 11로 나눈 나머지 값을 구함.
             * 4. 11에서 그 나머지 값을 뺀 뒤, 그것을 10으로 나눈 나머지 값을 구함.
             */
            int SumOfNum = (Convert.ToInt32(Convert.ToString(Value[0])) * 2)
                           + (Convert.ToInt32(Convert.ToString(Value[1])) * 3)
                           + (Convert.ToInt32(Convert.ToString(Value[2])) * 4)
                           + (Convert.ToInt32(Convert.ToString(Value[3])) * 5)
                           + (Convert.ToInt32(Convert.ToString(Value[4])) * 6)
                           + (Convert.ToInt32(Convert.ToString(Value[5])) * 7)
                           + (Convert.ToInt32(Convert.ToString(Value[6])) * 8)
                           + (Convert.ToInt32(Convert.ToString(Value[7])) * 9)
                           + (Convert.ToInt32(Convert.ToString(Value[8])) * 2)
                           + (Convert.ToInt32(Convert.ToString(Value[9])) * 3)
                           + (Convert.ToInt32(Convert.ToString(Value[10])) * 4)
                           + (Convert.ToInt32(Convert.ToString(Value[11])) * 5);

            int CheckDigit = (11 - (SumOfNum % 11)) % 10;

            return(Value + CheckDigit);
        }