Skip to content

Instantly share code, notes, and snippets.

@donpandix
Last active January 7, 2024 22:29
Show Gist options
  • Save donpandix/045f865c3bf800893036 to your computer and use it in GitHub Desktop.
Save donpandix/045f865c3bf800893036 to your computer and use it in GitHub Desktop.
Valida rut Chileno con c#, basado el algoritmo modulo 11
/// <summary>
/// Validador de RUT Chileno
/// Hace uso del algoritmo Modulo 11
///
/// Chilean ID Number validator
/// Use the algorithm called Module 11
/// </summary>
class Rut {
/// <summary>
/// Metodo de validación de rut con digito verificador
/// dentro de la cadena
/// </summary>
/// <param name="rut">string</param>
/// <returns>booleano</returns>
public static bool ValidaRut(string rut) {
rut = rut.Replace(".", "").ToUpper();
Regex expresion = new Regex("^([0-9]+-[0-9K])$");
string dv = rut.Substring(rut.Length - 1, 1);
if (!expresion.IsMatch(rut)) {
return false;
}
char[] charCorte = { '-' };
string[] rutTemp = rut.Split(charCorte);
if (dv != Digito(int.Parse(rutTemp[0]))) {
return false;
}
return true;
}
/// <summary>
/// Método que valida el rut con el digito verificador
/// por separado
/// </summary>
/// <param name="rut">integer</param>
/// <param name="dv">char</param>
/// <returns>booleano</returns>
public static bool ValidaRut(string rut, string dv) {
return ValidaRut(rut + "-" + dv);
}
/// <summary>
/// método que calcula el digito verificador a partir
/// de la mantisa del rut
/// </summary>
/// <param name="rut"></param>
/// <returns></returns>
public static string Digito(int rut) {
int suma = 0;
int multiplicador = 1;
while (rut != 0) {
multiplicador++;
if (multiplicador == 8)
multiplicador = 2;
suma += (rut % 10) * multiplicador;
rut = rut / 10;
}
suma = 11 - (suma % 11);
if (suma == 11) {
return "0";
} else if (suma == 10) {
return "K";
} else {
return suma.ToString();
}
}
}
@unho
Copy link

unho commented Jun 4, 2019

For which RUT is this? Chile?, Uruguay?

@donpandix
Copy link
Author

Is for a Chilean ID number, the algorithm is called ”module 11”.

@unho
Copy link

unho commented Jun 5, 2019

It would be great if you can edit the gist code to include a comment stating that.

@donpandix
Copy link
Author

It would be great if you can edit the gist code to include a comment stating that.

Thanks for the advice, I just add a text in the head of the code with this information. Thanks again.

@c4rl0s30
Copy link

Hola,
muchas gracias por tu aporte, soy nuevo en esto. Estoy tratando de implementar la validación solamente del "digito verificador", tengo una consulta, Para el caso del método public static string Digito(int rut) { ....} , el rut que le debo pasar debe ser antes del "-" ?, por ejemplo si tengo un número 21924302-2 debería pasar como parámetro el número "21924302" y el método retornaría el 2?. muchas gracias

@donpandix
Copy link
Author

Hola amigo, si efectivamente, cuando haces uso de ese método en particular, lo que obtienes es el valor del dígito verificador. de 0 a 9 o el valor K mayúscula

@despinoza1989
Copy link

Hola master, buenas noches, este método sabes si funciona para Xamarin?

@CristiaanRojas
Copy link

Hola amigo, una consulta, podrías explicar la línea 18? Me interesa usar tu validador, pero para el caso de uso que tengo debo considerar rut's de empresas, me gustaría saber cómo debería modificar la expresión regular que usas para considerar esto, agradecería tu ayuda, saludos :)

@donpandix
Copy link
Author

Hola master, buenas noches, este método sabes si funciona para Xamarin?

Hola Buenas, la verdad no lo he probado en esa plataforma, de todas maneras intuyo que si, ya que lo que la función que expongo es de c# mas que de una plataforma en particular, a lo mejor haya que ajustar algo, pero de todas formas debiese trabajar. Saludos

@donpandix
Copy link
Author

Hola amigo, una consulta, podrías explicar la línea 18? Me interesa usar tu validador, pero para el caso de uso que tengo debo considerar rut's de empresas, me gustaría saber cómo debería modificar la expresión regular que usas para considerar esto, agradecería tu ayuda, saludos :)

Hola que tal, si es bien sencilla y la verdad es que se usa de forma muy similar en otros lenguajes (como php por ejemplo) y lo que hace esa línea en particular es generar una regla de validación en base a una expresión regular, la cual valida que el texto de entrada tenga la forma #######-# , donde la primera parte (previo a la linea divisoria) debe tener al menos 1 número, luego una linea divisoria y finalmente un dígito o un carácter "K" por lo que debiese servir para RUTs de empresa, de todas maneras te insto a que incursiones el tema de las expresiones regulares porque es muy útil en validaciones de forma en el valor de los parámetros, en particular en lo que son del tipo GET o POST para evitar la inyección del código en tus aplicaciones.

Por otra lado Regex es una clase de C# que permite tomar como entrada una expresión regular para después evaluar otras cadenas de texto si se ajustan al patrón de la expresión regular. (usado en la línea 20)

adjunto un pantallazo con la prueba de la expresión que hice en la página https://regexr.com que es muy útil para modificar o crear tus propias expresiones regulares

Captura de Pantalla 2021-05-12 a la(s) 09 28 08

@CristiaanRojas
Copy link

CristiaanRojas commented May 12, 2021

Hola Cesar, muchas gracias por la pronta respuesta, explicación muy detallada, muy útil, saludos :)

@frdiaz
Copy link

frdiaz commented Nov 26, 2022

Excelente aporte.

@Dizkm8
Copy link

Dizkm8 commented Nov 3, 2023

Hola! Estoy trabajando en un proyecto .NET 7 y me encontré con tu gists, te agradezco el trabajo ya que me ahorró tiempo. He cambiado unas cosas para poder adaptarlo a las nuevas versiones, por si a alguien más le llega a servir: https://gist.github.com/Dizkm8/68d63edb3c5941e45597cfaebaca03f8

Saludos!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment