Sur.Modulus11.Rut 1.1.0

dotnet add package Sur.Modulus11.Rut --version 1.1.0                
NuGet\Install-Package Sur.Modulus11.Rut -Version 1.1.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Sur.Modulus11.Rut" Version="1.1.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Sur.Modulus11.Rut --version 1.1.0                
#r "nuget: Sur.Modulus11.Rut, 1.1.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Sur.Modulus11.Rut as a Cake Addin
#addin nuget:?package=Sur.Modulus11.Rut&version=1.1.0

// Install Sur.Modulus11.Rut as a Cake Tool
#tool nuget:?package=Sur.Modulus11.Rut&version=1.1.0                

Modulus11

For a modulo 11 library please check Modulus 11

Para una librería de Módulo 11, por favor revisa Modulus 11

Propósito

"Facilitar la creación, validación y compartición de ruts con sus correspondientes dígitos verificadores en Modulo 11."

Esto se logra mediante:

  • Crear una biblioteca fácil de usar.
  • Proporcionar personalización sencilla con parámetros predeterminados.
  • Retornar tanto strings formateados como records con el rut desglosado y capaz de dar formato al objeto módulo 11.
  • Proporcionar las herramientas de formato necesarias para procesar, validar y generar ruts.

Modulo 11 es un algoritmo aritmético utilizado para validar números enteros. Se utiliza ampliamente en criptografía y en la validación de códigos numéricos de documentos.

Como ejemplo, la cédula de identidad nacional de Chile, el RUT, utiliza un número entero para identificar personas, instituciones y empresas. Para reducir errores, se agrega al final el módulo 11 de ese número.

ID: 12345678
Módulo 11 de la ID: 9
Cédula de Identidad: 12345678-9

ID: 11222333
Módulo 11 de la ID: 8
Cédula de Identidad: 11222333-8

Si los módulos 11 no coinciden, sabemos con certeza que hay un error en el número o en la suma de verificación.
Ayuda a verificar la integridad del número, no está destinado a corregirlo.

El algoritmo

Proporcionaré una breve explicación; por favor, busca en Wikipedia para obtener detalles.

Básicamente, debemos multiplicar cada dígito, de derecha a izquierda, con un búfer circular de seis dígitos (2,3,4,5,6,7), avanzando al inicio si tienes más de 6 dígitos en el código.
Sumamos todos ellos y obtenemos el módulo 11 (número mod 11). Da el residuo.
Luego, calculamos una diferencia, DIF=11-residuo:
Si el resultado es 10, usaremos 'K'
Si el resultado es 11, 0
De lo contrario, DIF /* entre 0-9 */

En algunas implementaciones, en lugar de usar 0 cuando el residuo es 10, el código de verificación se reemplaza por un carácter especial. Un ejemplo es el RUT chileno, donde 10 se reemplaza por una 'k' y no un cero.

Ejemplo 1: 987654321

Búfer circular 4 3 2 7 6 5 4 3 2
Número 9 8 7 6 5 4 3 2 1
Multiplicación 4x9 3x8 2x7 7x6 6x5 5x4 4x3 3x2 2x1
Resultado 36 24 14 42 30 20 12 6 2

La suma es 186 y el residuo es 10 (186%11 = 10)
DIF = 11-10=1
Código = 1, 987654321-1

Ejemplo 2: 44261539

Búfer circular 4 3 2 7 6 5 4 3 2
Número 4 4 2 6 1 5 3 9
Multiplicación 4x 3x4 2x4 7x2 6x6 5x1 4x5 3x3 2x9
Resultado 0 12 8 14 36 5 20 9 18

La suma es 122 y el residuo es 1 (122%11 = 1)
DIF = 11-1=10 // Regla: si 10 ⇒ 'k'
Código = 'k', 44261539-k

Validación y generación

La clase RutManager sirve para generar y validar ruts. El constructor puede personalizarse de la siguiente manera:

    /// <param name="minDigits">1 a maxDigits</param>
    /// <param name="maxDigits">Desde minDigits hasta 12</param>
    /// <param name="charForKValue">Por omisión, "k" minúscula</param>
    public RutManager(byte minDigits = 1, byte maxDigits = 8, char charForKValue = 'k')

Así, podremos limitar los rangos (ya no debieran quedar ruts o personas jurídicas con menos de cuatro dígitos) y si usaremos k mayúscula o minúscula (Recordar que el módulo 11 estándar usa '1' en vez de 'k')

Validar un rut con o sin puntos

Acepta 12.345.678-5 y 12345678-5

	var sRut = "76113195-8";

	var rm = new RutManager();
	
	var result = rm.ValidaRut(sRut, TipoValidacionSeparadorEnum.ConOSinPuntos);

	if (result)
	{
	 // ...
	}

Exigir puntos

Acepta 12.345.678-5 y rechaza 12345678-5

	var sRut = "76.113.195-8";

	var rm = new RutManager();
	
	var rm = new RutManager();

	if (result)
	{
	 // ...
	}

Generar rut

Obtiene un record que mantiene parámetros de formato como guión y separador de miles

	long number=76113195-8;

	// Entre 5 y 8 dígitos
	var rm = new RutManager(5,8);

	var sinPuntos = rm.GetRutRecord(number);
	var conPuntos = rm.GetRutRecord(number, "-", NumberGroupSeparator:".");

	Console.Write("Sin puntos para el número " sinPuntos.Number);
	Console.WriteLine(sinPuntos); // o sinPuntos.ToString()

	Console.Write("Con puntos para el número " conPuntos.Number);
	Console.WriteLine(conPuntos); // o conPuntos.ToString()

Public enum TipoValidacionSeparadorEnum

/// <summary>
/// Opciones de validación de rut
/// </summary>
public enum TipoValidacionSeparadorEnum
{
    ConOSinPuntos,
    RequerirPuntos,
    DenegarPuntos,        
}

Public class RutManager

/// <summary>
/// Encapsula las operaciones necesarias para validar y generar ruts
/// </summary>
public class RutManager
{
    /// <param name="minDigits">1 a maxDigits</param>
    /// <param name="maxDigits">Desde minDigits hasta 12</param>
    /// <param name="charForKValue">Por omisión, "k" minúscula</param>
    public RutManager(byte minDigits = 1, byte maxDigits = 8, char charForKValue = 'k');


    /// <param name="rut"></param>
    /// <param name="tipo"></param>
    /// <param name="soloFormato">Sólo valida formato, no el dv ni los dígitos</param>
    /// <returns></returns>
    public bool ValidaRut(string rut, TipoValidacionSeparadorEnum tipo = TipoValidacionSeparadorEnum.ConOSinPuntos, bool soloFormato = false);
    

    /// <remarks>
    /// El objeto record retornado incluye el formato numérico definido (conSeparadores) y separador con guión
    /// </remarks>
	/// <param name="input">Número</param>
    /// <param name="conSeparadores">Puntos o no puntos</param>
    /// <returns>RutRecord con un rut válido</returns>
    /// <exception cref="RutOutOfRangeException"></exception>
    public ModulusRecord GeneraRutRecord(long input, bool conSeparadores = false);


    /// <param name="rut"></param>
    /// <param name="conSeparadores">Puntos o no puntos</param>
    /// <returns></returns>
    public string GeneraRut(ModulusRecord rut, bool conSeparadores = false);


    /// <param name="input"></param>
    /// <param name="conSeparadores">Puntos o no puntos</param>
    /// <returns></returns>
    /// <exception cref="RutOutOfRangeException"></exception>
    public string GeneraRut(long input, bool conSeparadores = false);
}

Jorge Rojas @ 2024 bajo licencia MIT

jorge.rojasmata@outlook.com / +56(9)94328521

Product Compatible and additional computed target framework versions.
.NET net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.1.0 133 2/20/2024
1.0.3 118 2/10/2024

Primera versión