/// <summary> /// Checks if a string value is a valid CPF representation /// </summary> /// <param name="value">a CPF string to be checked</param> /// <param name="punctuation">the punctuation setting to /// how validation must be handled</param> /// <returns>true if CPF string is valid; false otherwise</returns> internal static bool Validate(string value, CpfPunctuation punctuation) { if (StringHelper.IsNullOrWhiteSpace(value)) { return(false); } if (!Regex.IsMatch(value, CpfHelper.regexValidations[punctuation])) { return(false); } value = CpfHelper.Sanitize(value); if (CpfHelper.IsSameDigit(value)) { return(false); } var inputDigit1 = int.Parse( value.Substring(9, 1), CultureInfo.InvariantCulture); var inputDigit2 = int.Parse( value.Substring(10, 1), CultureInfo.InvariantCulture); var calcDigit1 = CpfHelper.CreateChecksum(value.Substring(0, 9)); var calcDigit2 = CpfHelper.CreateChecksum(value.Substring(0, 10)); return(inputDigit1 == calcDigit1 && inputDigit2 == calcDigit2); }
/// <summary> /// Completes a partial CPF string by appending a valid checksum trailing /// </summary> /// <param name="value">a partial CPF string with or without punctuation</param> /// <returns>a CPF string with a valid checksum trailing</returns> internal static string Complete(string value) { if (StringHelper.IsNullOrWhiteSpace(value)) { throw new ArgumentException("O CPF é inválido"); } value = CpfHelper.Sanitize(value); if (!Regex.IsMatch(value, @"\d{9}")) { throw new ArgumentException("O CPF é inválido"); } int digit1 = CpfHelper.CreateChecksum(value); int digit2 = CpfHelper.CreateChecksum(value + digit1.ToString()); return(value + digit1.ToString() + digit2.ToString()); }