19 jun 2011

Encriptación por el método Bifido en .NET


El método Bífido es un cifrado fraccionario. Es decir que cada letra viene representada por una o más letras o símbolos, y donde se trabaja con estos símbolos más que con las letras mismas.

El método comienza con la utilización de un alfabeto ordenado o desordenado (depende del grado de dificulad que se le pretenda dar en su descifrado) en una matriz 5x5.

En este ejemplo utilizaremos la siguiente matriz: 


Al ser una matriz de 5x5 nos vemos obligados a cifrar de la misma forma la I y la J. El contexto nos permitirá distinguir cual de las dos letras se pretendía cifrar.

Para cifrar el texto en claro se escriben los equivalentes numéricos de cada letra, utilizando sus "coordenadas".

Por ejemplo: HOLA MUNDO, genera las siguientes coordenadas (f,c) 233431113245331434, y para proceder con la encriptacion la cadena de coordenadas resultantes es dividida en dos:
233431113
245331434

y se forma una nueva cadena de coordenadas 22 34 35 43 33 11 14 13 34 las cuales formaran el nuevo mensaje encriptado GOPS NADCO.

Este método altera la frecuencia de los caracteres a diferencia de lo que ocurre por ejemplo con los cifrados monoalfabéticos.

La siguiente clase, hecha en vb.net realiza los pasos anteriormente descritos, esta comentada y creo que facilmente entendible

Public Class Bifido

    ' @web http://www.jc-mouse.net
    ' @author Mouse

    Dim matriz(5, 5) As Char
    Dim mensaje() As Char ' se guarda todo el mensaje
    Dim abc As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"


    Public Sub New()
        'la matriz esta formada por 25 letras, donde el caracter I=J
        matriz(1, 1) = "A" : matriz(1, 2) = "B" : matriz(1, 3) = "C" : matriz(1, 4) = "D" : matriz(1, 5) = "E"
        matriz(2, 1) = "F" : matriz(2, 2) = "G" : matriz(2, 3) = "H" : matriz(2, 4) = "I" : matriz(2, 5) = "K"
        matriz(3, 1) = "L" : matriz(3, 2) = "M" : matriz(3, 3) = "N" : matriz(3, 4) = "O" : matriz(3, 5) = "P"
        matriz(4, 1) = "Q" : matriz(4, 2) = "R" : matriz(4, 3) = "S" : matriz(4, 4) = "T" : matriz(4, 5) = "U"
        matriz(5, 1) = "V" : matriz(5, 2) = "W" : matriz(5, 3) = "X" : matriz(5, 4) = "Y" : matriz(5, 5) = "Z"
    End Sub

    Public Function Encriptar(ByVal texto As String) As String
        texto = Limpiar_Texto(texto)
        Dim pos_matriz As String = ""
        Dim encriptado As String = ""
        Dim fila As Integer
        Dim col As Integer
        'para cada caracter se extrae el par de numeros correspondientes de la matriz
        Dim c() As Char = texto.ToCharArray()
        For i = 0 To c.Length - 1
            pos_matriz = pos_matriz + getposicion(c(i))
        Next
        'Ahora se realiza el proceso de encriptacion        
        Dim x() As Char = pos_matriz.ToCharArray
        For i = 0 To x.Length / 2 - 1
            fila = Integer.Parse(x(i))
            col = Integer.Parse(x(i + x.Length / 2))
            encriptado = encriptado & matriz(fila, col)
        Next
        encriptado = Reconstruir_Mensaje(encriptado)
        Return encriptado
    End Function

    Public Function Desencriptar(ByVal t As String) As String
        t = Limpiar_Texto(t)
        Dim pos_matriz As String = ""
        Dim tmp1 As String = ""
        Dim tmp2 As String = ""
        Dim band As Boolean = True
        'para cada caracter se extrae el par de numeros correspondientes en la matriz
        For i = 0 To t.Length - 1
            pos_matriz = pos_matriz + getposicion(t.Substring(i, 1))
        Next
        'como la cadena de numeros se encuentra encriptada, se procede
        'a su nuevo ordenamiento
        For i = 0 To pos_matriz.Length - 1
            If band Then
                tmp1 = tmp1 & pos_matriz.Substring(i, 1)
                band = False
            Else
                tmp2 = tmp2 & pos_matriz.Substring(i, 1)
                band = True
            End If
        Next
        pos_matriz = tmp1 + tmp2
        tmp1 = ""
        Dim fila As Integer
        Dim col As Integer
        'ahora que ya se tiene a la cadena de numeros con el orden original
        'se procede a reconstruir el mensaje
        Dim x() As Char = pos_matriz.ToCharArray
        For i = 0 To x.Length - 1 Step 2
            fila = Integer.Parse(x(i))
            col = Integer.Parse(x(i + 1))
            tmp1 = tmp1 + matriz(fila, col).ToString
        Next
        tmp1 = Reconstruir_Mensaje(tmp1)
        Return tmp1
    End Function

    'obtiene la posicion de filas y columnas correspondientes al caracter 
    'pasado como parametro en la matriz
    Private Function getposicion(ByVal c As Char) As String
        Dim posicion As String = ""
        Dim band As Boolean = False
        If c = "J" Then ' Caso especial
            'se añade automaticamente con la posicion del caracter I
            posicion = "24"
        Else
            For i = 1 To 5
                For j = 1 To 5
                    If (c = matriz(i, j)) Then
                        posicion = i & j
                        band = True
                        If band Then Exit For
                    End If
                Next
                If band Then Exit For
            Next
        End If
        Return posicion
    End Function

    'encargado de limpiar el mensaje extrayendo solo las letras y
    'guardando los caracteres especiales para rearmar el mensaje despues
    Private Function Limpiar_Texto(ByVal t As String) As String
        t = t.ToUpper
        'descompone el mensaje en un array de caracteres
        mensaje = t.ToCharArray
        Dim tmp1 As String = ""
        'extrae solo las letras validas
        For i = 0 To mensaje.Length - 1
            Dim x As Integer = abc.IndexOf(mensaje(i))
            If x <> -1 Then 'es una letra valida
                tmp1 = tmp1 + mensaje(i)
            End If
        Next
        Return tmp1
    End Function

    'reconstruye el mensaje con las palabras encriptadas/desencriptadas
    'añadiendo los caracteres especiales que no son alterados
    Private Function Reconstruir_Mensaje(ByVal texto As String) As String
        Dim r_mensaje As String = ""
        Dim count As Integer = 0
        Dim k As Integer = mensaje.Length - 1
        Dim t() As Char = texto.ToCharArray
        For i = 0 To k
            Dim x As Integer = abc.IndexOf(mensaje(i))
            If x <> -1 Then
                r_mensaje = r_mensaje & t(count)
                count = count + 1
            Else
                r_mensaje = r_mensaje & mensaje(i)
            End If
        Next
        Return r_mensaje
    End Function

End Class

Su implementacion desde consola para la encriptacion tenemos:


Sub Main()
        Dim bifido As Bifido = New Bifido
        Dim s As String = bifido.Encriptar("Copyright 2011 - jc Mouse Bolivia " & vbCrLf & _
                        "Algoritmo de Encriptación Método Bífido" & vbCrLf & "All rights reserved")
        Console.WriteLine(s)
        Console.ReadKey()
    End Sub

y la salida en pantalla
Para desencriptar, solo utilizar el metodo apropiado ( desencriptar() ) y listo

8 jun 2011

Crear Themes para ASP.NET [*.skin]

Visual Studio nos permite crear Themes (Temas) para las paginas web de ASP, con estos Themes podemos personalizar la interfaz de nuestro WebSite ya que aplicamos un standar al tamaño, fuente, color, alineación, etc de los controles como Labels, Button, Panel, Calendar, etc, ademas de que nos ayuda a agilizar el trabajo de construcción del sitio web asi como su posterior mantenimiento.


Los Themes son similares a las hojas de estilo CSS ya qye ambos trabajan con los atributos de los controles y se aplican a cualquier página donde se llame al Theme o la Hoja de Estilo. Sin embargo, los SKIN se diferencian de las hojas de estilo por:

  • Los Themes a diferencia de los CSS pueden definir muchas propiedades de un control o una página, no sólo un conjunto específico de propiedades de estilo.
  • Los Themes pueden incluir archivos auxiliares, tales como gráficos, que no se pueden incluir en una hoja de estilos CSS.
  • Los Themes pueden incluir imagenes y hojas de estilo independientes de la aplicación web
 Codigo Fuente
Click para descargar

    Sesiones en ASP.NET


    Videotutorial bastante facil de seguir y realizar donde se explica una forma sencilla para el manejo de sesiones (Session) en ASP.NET utilizando el lenguaje de Visual Basic.

    Para este ejemplo se diseña una pequeña tienda on-line  donde el cliente va agregando productos al carrito de compras y al final puede ver una lista de todos los productos que eligio.

    El manejo de sesiones para utilizarlos como contenedores de datos (en este caso nombres de productos) es el uso mas habitual que se le da a las variables de Session, claro, en estas variables no se debe almacenar nunca cadenas de conexion, password, o datos personales y privados de los usuarios ya que estas podrian ser modificadas o robadas por otras personas.

    Nota: en el minuto 4,  donde dice "Si variable sesion no existe, entonces la crea", debe decir, "Si la variable de sesion no existe, crea un ArrayList vacio", error de dedo ;)

    4 jun 2011

    GridView con imagen en ASP

    En este videotutorial se muestra la forma de colocar una imagen en un control GridView en Visual Studio, Se utiliza una base de datos en MySQL, pero el tutorial tambien es valido para SQL como para una base de datos Access.

    Solamente se utiliza una tabla, que puede ser creada en cualquiera de las base de datos mencionadas, su estructura es la siguiente:


    -- 
    -- Base de datos: 'dbimagenes'
    -- 
    -- --------------------------------------------------------
    -- 
    -- Estructura de tabla para la tabla 'timagenes'
    -- 
    CREATE TABLE timagenes (
      Nombre varchar(60) default NULL,
      Foto varchar(60) default NULL
    )
    -- --------------------------------------------------------
    -- 
    -- Datos de la tabla "timagenes"
    -- 
    INSERT INTO timagenes VALUES ('Juan Melo Machuca', '/juan.jpg');
    INSERT INTO timagenes VALUES ('Benito Camela Suavecito', '/benito.jpg');
    INSERT INTO timagenes VALUES ('Ana Liza Melchoto', '/ana.jpg');

    Tambien necesitaras tres imagenes 'juan.jpg', 'benito.jpg' y 'ana.jpg'


    El Video es sumanente sencillo de seguir, ademas de corto, si tiene algun problema en seguir el video, presione "pausa", no me gusta hacer videos demasiado largos donde mas de la  mitad se pasa uno hablando de anecdotas personales o de cosas que no tienen nada que ver con el tutorial como vi en otro lado, sin más palabras, el video.

    6 may 2011

    Los diferentes lenguajes y la compilación

    Un lenguaje utilizado para escribir programas para computadora permite la comunicació Usuario-Máquina. Unos programas especiales llamados traductores traductores (Compilador, Interprete) convierten las instrucciones escritas en lenguajes de programación en lenguajes escritos en lenguaje máquina (0-1 bits) que ésta pueda entender.
    Lenguaje Maquina. Utiliza cadenas que son cadenas binarias (Serie de caracteres de 0 y 1) escritas en código de máquina o código binario, que son directamente intelegibles por su ordenador y puede obedecer inmediatamente sin traducción alguna.
    El codigo binario depende del hardware de la computadora.

    Lenguaje Objeto. Lenguaje o juego de instrucciones codificado a los cuales es traducido un lenguaje fuente por medio de un compilador, el lenguaje objeto es un lenguaje maquina directamente comprensible por su ordenador.
    Lenguaje de Bajo Nivel. Lenguaje básico o lenguaje en el cual cada instrucción se corresponde con un equivalente en codigo máquina, las instrucciones son una cadena de instrucciones alfabeticas.
    Lenguaje de Alto Nivel. Es un lenguaje natural, están diseñados para que las personas escriban y entiendan los programas de un modo más facil a los programas escritos en lenguaje máquina. El lenguaje de Alto Nivel es portable, es decir no dependen del hardware de la PC.

    Lenguaje Fuente. (Source Languaje) Un lenguaje de programación que no puede ser directamente procesado por el hardware de un ordenador y exige ser compilado y convertido en un programa objeto compuesto por instrucciones en lenguaje máquina que el ordenador pueda entender.

    Compilación

    La traducción de un lenguaje fuente de Alto Nivel a programas ejecutables en lenguaje máquina suele implicar más de un paso de traducción, el proceso mismo de compilación puede comprender un cierto número de pasos que traducen progresivamente el lenguaje a varias formas intermedias antes de producir el programa final.

    El proceso de traducción de programas de un lenguaje a otro equivalente, que realiza un compilador se conoce como "Compilación".

    3 may 2011

    Convertir Número a Letras en VB

    Cuando se realizan trabajos donde se necesita mostrar al cliente un determinado monto de dinero, tipo factura, recibo, cheque, etc, el cliente desea ver el monto en numeral asi como en literal.

    Por ejemplo:

    877866,50 = ochocientos setenta y siete mil ochocientos sesenta y seis 50/100 Bolivianos
    Pues bien, la siguiente clase a la que llame NumLetra.cs realiza justamente esa operacion, esta extracomentada y trate de hacerla lo mas entendible posible. El proyecto en C#, lo llame con_NumLetraC

    La logica que se utliza es la siguiente:

    La clase recibe un numero ej. 123456789,50
    valida este numero, si el numero no es valido devuelve NULL
    Si el numero es valido segun sea este unidad, decena, centena, mil o millon,  va clasificando el numero y llama a sus procedimientos correspondientes, estas funciones, son utilizadas en cascada, osea:
    nuestro numero de ejemplo es 123456789,50, entonces separa en 123456789 y 50, siendo 50 nuestra parte decimal.

    El  numero entero, 123456789 es clasificado = es millon, entonces llama a la funcion getMillones, esta funcion a la vez divide el numero en miles y millones
    123456789 = 123 456789 donde 123 corresponde a millones y 456789 a miles
    entonces la misma funcion llama a las funciones getMiles, getCentenas, getUnidades, segun corresponda, al igual que la funcion getMiles, hace uso de getCentenas, getDecenas getUnidades, lo mismo getCentenas, hace uso de getDececas, getUnidades.

    Espero se entienda :)


    Imports System.Text.RegularExpressions
    
    Public Class NumLetra
    
        Dim UNIDADES As String() = {"", "un ", "dos ", "tres ", "cuatro ", "cinco ", "seis ", "siete ", "ocho ", "nueve "}
        Dim DECENAS As String() = {"diez ", "once ", "doce ", "trece ", "catorce ", "quince ", "dieciseis ", "diecisiete ", "dieciocho ", "diecinueve", "veinte ", "treinta ", "cuarenta ", "cincuenta ", "sesenta ", "setenta ", "ochenta ", "noventa "}
        Dim CENTENAS As String() = {"", "ciento ", "doscientos ", "trecientos ", "cuatrocientos ", "quinientos ", "seiscientos ", "setecientos ", "ochocientos ", "novecientos "}
    
        Dim r As Regex
    
    
        Sub NumLetra()
        End Sub
    
        Public Function Convertir(ByVal numero As String, ByVal mayusculas As Boolean) As String
            Dim literal As String = ""
            Dim parte_decimal As String = ""
            'si el numero utiliza (.) en lugar de (,) -> se reemplaza
            numero = Replace(numero, ".", ",")
            'si el numero no tiene parte decimal, se le agrega ,00        
            If numero.IndexOf(",") = -1 Then
                numero = numero & ",00"
            End If
            'se valida formato de entrada -> 0,00 y 999 999 999,00
            'if (Pattern.matches("\\d{1,9},\\d{1,2}", numero)) {
    
            r = New Regex("\d{1,9},\d{1,2}")
            Dim mc As MatchCollection = r.Matches(numero)
            If mc.Count > 0 Then
                'se divide el numero 0000000,00 -> entero y decimal
                Dim Num As String() = numero.Split(",")
                'de da formato al numero decimal
                parte_decimal = Num(1) & "/100 Bolivianos."
                'se convierte el numero a literal            
                If Num(0) = 0 Then
                    literal = "cero "
                ElseIf Num(0) > 999999 Then
                    literal = getMillones(Num(0))
                ElseIf Num(0) > 999 Then
                    literal = getMiles(Num(0))
                ElseIf Num(0) > 99 Then
                    literal = getCentenas(Num(0))
                ElseIf Num(0) > 9 Then
                    literal = getDecenas(Num(0))
                Else
                    literal = getUnidades(Num(0))
                End If
                'devuelve el resultado en mayusculas o minusculas
                If mayusculas Then
                    Return (literal & parte_decimal).ToUpper
                Else
                    Return literal & parte_decimal
                End If
            Else
                Return ""
            End If
    
        End Function
    
        ' funciones para convertir los numeros a literales
    
        Private Function getUnidades(ByVal numero As String) As String '1 - 9
            'si tuviera algun 0 antes se lo quita -> 09 = 9 o 009=9
            Dim num As String = numero.Substring(numero.Length - 1)
            Return UNIDADES(num)
        End Function
    
        Private Function getDecenas(ByVal numero As String) As String '99
            If numero < 10 Then 'para casos como -> 01 - 09
                Return getUnidades(numero)
            ElseIf numero > 19 Then 'para 20...99
                Dim u As String = getUnidades(numero)
                If u.Equals("") Then 'para 20,30,40,50,60,70,80,90
                    Return DECENAS(numero.Substring(0, 1) + 8)
                Else
                    Return DECENAS(numero.Substring(0, 1) + 8) & "y " & u
                End If
            Else
                Return DECENAS(numero - 10)
            End If
        End Function
    
        Private Function getCentenas(ByVal numero As String) As String
            If numero > 99 Then 'es centena
                If numero = 100 Then 'caso especial
                    Return "cien "
                Else
                    Return CENTENAS(numero.Substring(0, 1)) & getDecenas(numero.Substring(1))
                End If
            Else 'se quita el 0 antes de convertir a decenas
                Return getDecenas(numero)
            End If
        End Function
    
    
        Private Function getMiles(ByVal numero As String) As String
            'obtiene las centenas'
            Dim c As String = numero.Substring(numero.Length - 3)
            'obtiene los miles
            Dim m As String = numero.Substring(0, numero.Length - 3)
            Dim n As String = ""
            'se comprueba que miles tenga valor entero
            If m > 0 Then
                n = getCentenas(m)
                Return n & " mil " & getCentenas(c)
            Else
                Return "" & getCentenas(c)
            End If
        End Function
    
        Private Function getMillones(ByVal numero As String) As String
            'se obtiene los miles
            Dim miles As String = numero.Substring(numero.Length - 6)
            'millones
            Dim millon As String = numero.Substring(0, numero.Length - 6)
            Dim n As String = ""
            If millon > 9 Then
                n = getCentenas(millon) & " millones "
            Else
                n = getUnidades(millon) & " millon "
            End If
            Return n & getMiles(miles)
        End Function
    End Class
     Esta clase, recibe  un numero de 0,00 a 999999999.00 en formato String, el separador decimal puede ser un punto (.) o una coma (,), ademas tiene un parametro booleano "mayusculas" el cual sea verdadero (true) o falso (false), retorna el resultado en mayusculas o minusculas, esta clase no acepta numeros negativos ni tampoco numero mayores o iguales a mil millones, aunque claro trate de escribir esta clase para que sea facilmente comprensible y asi pueda ser ampliado o modificado segun sus necesidades.

    La forma de llamara a esta clase es:


    Module Module1
    
        Sub Main()
            Dim NL As New NumLetra
            Dim a As String
            a = NL.Convertir("123456789,50", False)
            Console.WriteLine(a)
    
            a = NL.Convertir("4524011.50", False)
            Console.WriteLine(">" & a)
    
            a = NL.Convertir("999999999,50", False)
            Console.WriteLine(">" & a)
    
            a = NL.Convertir("001000925,50", False)
            Console.WriteLine(">" & a)
    
            a = NL.Convertir("0,50", True)
            Console.WriteLine(">" & a)
    
            a = NL.Convertir("7,50", False)
            Console.WriteLine(">" & a)
    
            a = NL.Convertir("69,50", True)
            Console.WriteLine(">" & a)
    
            a = NL.Convertir("6969,50", False)
            Console.WriteLine(">" & a)
    
            Console.ReadKey()
        End Sub
    
    End Module

    Y al ejecutar el proyecto tenemos:
     Puedes ver el proyecto original en java, desde aqui

    25 abr 2011

    Convertir Número a Letras en C#

    Cuando se realizan trabajos donde se necesita mostrar al cliente un determinado monto de dinero, tipo factura, recibo, cheque, etc, el cliente desea ver el monto en numeral asi como en literal.

    Por ejemplo:

    877866,50 = ochocientos setenta y siete mil ochocientos sesenta y seis 50/100 Bolivianos
    Pues bien, la siguiente clase a la que llame NumLetra.cs realiza justamente esa operacion, esta extracomentada y trate de hacerla lo mas entendible posible. El proyecto en C#, lo llame con_NumLetraC

    La logica que se utliza es la siguiente:

    La clase recibe un numero ej. 123456789,50
    valida este numero, si el numero no es valido devuelve NULL
    Si el numero es valido segun sea este unidad, decena, centena, mil o millon,  va clasificando el numero y llama a sus procedimientos correspondientes, estas funciones, son utilizadas en cascada, osea:
    nuestro numero de ejemplo es 123456789,50, entonces separa en 123456789 y 50, siendo 50 nuestra parte decimal.

    El  numero entero, 123456789 es clasificado = es millon, entonces llama a la funcion getMillones, esta funcion a la vez divide el numero en miles y millones
    123456789 = 123 456789 donde 123 corresponde a millones y 456789 a miles
    entonces la misma funcion llama a las funciones getMiles, getCentenas, getUnidades, segun corresponda, al igual que la funcion getMiles, hace uso de getCentenas, getDecenas getUnidades, lo mismo getCentenas, hace uso de getDececas, getUnidades.

    Espero se entienda :)


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    
    namespace con_NumLetraC
    {
        class NumLetra
        {
            private String[] UNIDADES = { "", "un ", "dos ", "tres ", "cuatro ", "cinco ", "seis ", "siete ", "ocho ", "nueve " };
            private String[] DECENAS = {"diez ", "once ", "doce ", "trece ", "catorce ", "quince ", "dieciseis ",
            "diecisiete ", "dieciocho ", "diecinueve", "veinte ", "treinta ", "cuarenta ",
            "cincuenta ", "sesenta ", "setenta ", "ochenta ", "noventa "};
            private String[] CENTENAS = {"", "ciento ", "doscientos ", "trecientos ", "cuatrocientos ", "quinientos ", "seiscientos ",
            "setecientos ", "ochocientos ", "novecientos "};
    
            private Regex r;
        
            public String Convertir(String numero, bool mayusculas) {
                
            String literal = "";
            String parte_decimal;    
            //si el numero utiliza (.) en lugar de (,) -> se reemplaza
            numero = numero.Replace(".", ",");
                
            //si el numero no tiene parte decimal, se le agrega ,00
            if(numero.IndexOf(",")==-1){            
                numero = numero + ",00";
            } 
            //se valida formato de entrada -> 0,00 y 999 999 999,00
            r = new Regex(@"\d{1,9},\d{1,2}");            
            MatchCollection mc = r.Matches(numero);
            if (mc.Count > 0) {
                //se divide el numero 0000000,00 -> entero y decimal
                String[] Num = numero.Split(',');                    
                
                //de da formato al numero decimal
                parte_decimal = Num[1] + "/100 Bolivianos.";
                //se convierte el numero a literal
                if (int.Parse(Num[0]) == 0) {//si el valor es cero                
                    literal = "cero ";
                }
                else if (int.Parse(Num[0]) > 999999)
                {//si es millon
                    literal = getMillones(Num[0]);
                }
                else if (int.Parse(Num[0]) > 999)
                {//si es miles
                    literal = getMiles(Num[0]);
                }
                else if (int.Parse(Num[0]) > 99)
                {//si es centena
                    literal = getCentenas(Num[0]);
                }
                else if (int.Parse(Num[0]) > 9)
                {//si es decena
                    literal = getDecenas(Num[0]);
                } else {//sino unidades -> 9
                    literal = getUnidades(Num[0]);
                }
                //devuelve el resultado en mayusculas o minusculas
                if (mayusculas) {                
                    return (literal + parte_decimal).ToUpper();
                } else {
                    return (literal + parte_decimal);
                }
            } else {//error, no se puede convertir
                return literal = null;
            }
        }
        
            /* funciones para convertir los numeros a literales */
    
            private String getUnidades(String numero)
            {   // 1 - 9            
                //si tuviera algun 0 antes se lo quita -> 09 = 9 o 009=9
                String num = numero.Substring(numero.Length - 1);            
                return UNIDADES[int.Parse(num)];
            }
    
            private String getDecenas(String num)
            {// 99                        
                int n = int.Parse(num);
                if (n < 10)
                {//para casos como -> 01 - 09
                    return getUnidades(num);
                }
                else if (n > 19)
                {//para 20...99
                    String u = getUnidades(num);
                    if (u.Equals(""))
                    { //para 20,30,40,50,60,70,80,90
                        return DECENAS[int.Parse(num.Substring(0, 1)) + 8];
                    }
                    else
                    {
                        return DECENAS[int.Parse(num.Substring(0, 1)) + 8] + "y " + u;
                    }
                }
                else
                {//numeros entre 11 y 19
                    return DECENAS[n - 10];
                }
            }
    
            private String getCentenas(String num)
            {// 999 o 099
                if (int.Parse(num) > 99)
                {//es centena
                    if (int.Parse(num) == 100)
                    {//caso especial
                        return " cien ";
                    }
                    else
                    {
                        return CENTENAS[int.Parse(num.Substring(0, 1))] + getDecenas(num.Substring(1));
                    }
                }
                else
                {//por Ej. 099 
                    //se quita el 0 antes de convertir a decenas
                    return getDecenas(int.Parse(num) + "");
                }
            }
    
            private String getMiles(String numero)
            {// 999 999
                //obtiene las centenas
                String c = numero.Substring(numero.Length - 3);
                //obtiene los miles
                String m = numero.Substring(0, numero.Length - 3);
                String n = "";
                //se comprueba que miles tenga valor entero
                if (int.Parse(m) > 0)
                {
                    n = getCentenas(m);
                    return n + "mil " + getCentenas(c);
                }
                else
                {
                    return "" + getCentenas(c);
                }
    
            }
    
            private String getMillones(String numero) 
            { //000 000 000        
                //se obtiene los miles
                String miles = numero.Substring(numero.Length - 6); 
                //se obtiene los millones
                String millon = numero.Substring(0, numero.Length - 6);
                String n = "";
                if (millon.Length > 1) 
                {
                    n = getCentenas(millon) + "millones ";
                }
                else
                {
                    n = getUnidades(millon) + "millon ";
                }
                return n + getMiles(miles);
            }
    
        }
    
    }

     Esta clase, recibe  un numero de 0,00 a 999999999.00 en formato String, el separador decimal puede ser un punto (.) o una coma (,), ademas tiene un parametro booleano "mayusculas" el cual sea verdadero (true) o falso (false), retorna el resultado en mayusculas o minusculas, esta clase no acepta numeros negativos ni tampoco numero mayores o iguales a mil millones, aunque claro trate de escribir esta clase para que sea facilmente comprensible y asi pueda ser ampliado o modificado segun sus necesidades.

    La forma de llamara a esta clase es:


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace con_NumLetraC
    {
        class Program
        {
            static void Main(string[] args)
            {
                NumLetra nl = new NumLetra();
    
                String numero = "57.60";            
                Console.WriteLine(nl.Convertir(numero,true));
    
                numero = "34557.70";
                Console.WriteLine(nl.Convertir(numero, false));
    
                numero = "4357,60";
                Console.WriteLine(nl.Convertir(numero, true));
    
                numero = "969.90";
                Console.WriteLine(nl.Convertir(numero, false));
    
                Console.ReadKey();
                
            }
        }
        
    }

    Y al ejecutar el proyecto tenemos:

     
    Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | cna certification