Colabora
 

Conversión de un número a texto

[por elMesero]

 

Fecha: 24/Nov/2008 (21-11-08)
Autor: Ricardo Bernave Llamocca Choquehuanca - [email protected]

 

 


Introducción :

Casi siempre visito esta site, y no se uds. pero siempre me he sentido incomodo de un aviso en particular que han puesto a la hora de descargar, "aun no has hecho ninguna colaboración", jaja, gracias al elGuille por permitirme colaborar también, ahora ya no siento que este abusando mucho de uds, aunque lo siga haciendo (jaja), espero seguir colaborando con algunos algoritmos para la resolución de algunos problemas o ideas que se nos plantean.

Presento esta mi primera colaboración gracias a la inspiración de un amigo, por preguntarme si había un comando en Visual Basic 2005 u otro que convirtiera un numero a su representación textual (ejemplo: 27 a Veintisiete), bueno, la verdad en ese momento no tenia idea si existía o no, solo me puse a pensar en como se haría para convertirlo, después de unos minutos en pensar, se me vino a la cabeza sentarme un rato con el lápiz y papel a diagramar un rato, y tratar de hacer un algoritmo simple, y en la cantidad mínima de líneas posibles, he aquí el fruto de trabajo, aunque debo dejar claro de ante mano, que solo he trabajado el algoritmo para la parte entera, la parte decimal aun la estoy pensando.

Del Algoritmo :

Aquí dejo, mas o menos como esta diseñada la interface, eso no importa mucho dado que el algoritmo es la fuerza de este aporte:

Se presentan dos graves fatalidades:

Primera:
El algoritmo no esta aun totalmente filtrado, por eso es que si insertas un numero superior a los 14 dígitos, el algoritmo probablemente falle, antes de eso, corre muy bonito.

Segunda:
El algoritmo por la forma de diseño, en vez de arrojar (Cincuenta y un mil), arroja (Cicuenta y uno mil), pequeño pero feo error, aun me falta filtrar eso, después todo corre muy bonito :D.

El código:

Bueno.

A continuación sigue código en Visual Basic 2005:

Function NumeroTexto(ByVal Numero As Double) As String

        'Para la fragmentacion del numero en su parte entera y decimal

        'Solo se trabaja con la parte entera, la parte decimal aun no esta implementada

        Dim ParteEntera, ParteDecimal, MenosUnDigito As Double

        'Para la defragmentacion del numero

        Dim Centenas, Miles, Millones As Double

        'Para almacenar el tamaño del numero en cadena y operar

        Dim Index As Integer

        'Temporal de almacenamiento

        Dim Temporal As String

        'Signo del numero, de por si como es positivo no se coloca nada

        Dim Signo As String = ""

 

        If Numero < 0 Then

            'Si el numero es negativo, se positiviza el numero

            Numero = -1 * Numero

            'Establecemos el signo como negativo

            Signo = "menos "

        End If

        'Separamos la parte entera del numero

        ParteEntera = Int(Numero)       

 

        'Si el numero tiene decimales, quiere decir que es mayor que su parte entera

        If Numero > ParteEntera Then

            'Si es el caso de que el numero tiene decimales, guardamos la parte decimal

            'El analisis de la parte decimal aun no lo eh terminado dado a tratamiento de VB 'sobre los puntos decimales, y el tamaño de decimal

            ParteDecimal = Numero - ParteEntera

            'Solo se trabajara con la parte entera

            Numero = ParteEntera

            MsgBox("Numero con Decimales, Solo Trabajaremos Con La Parte Entera")

        End If

 

'Convertimos el numero a cadena y lo almacenamos temporalmente al temporal

        Temporal = Numero.ToString

        'Al temporal le removemos el primer digito y el valor resultado como numero lo asignamos a menosundigito

        MenosUnDigito = Val(Temporal.Remove(0, 1))

        'Comienza el algoritmo

        Select Case Numero

            Case Numero To 20

                'Transformacion Basica

                Select Case Numero

                    Case 0

                        NumeroTexto = "cero"

                    Case 1

                        NumeroTexto = "uno"

                    Case 2

                        NumeroTexto = "dos"

                    Case 3

                        NumeroTexto = "tres"

                    Case 4

                        NumeroTexto = "cuatro"

                    Case 5

                        NumeroTexto = "cinco"

                    Case 6

                        NumeroTexto = "seis"

                    Case 7

                        NumeroTexto = "siete"

                    Case 8

                        NumeroTexto = "ocho"

                    Case 9

                        NumeroTexto = "nueve"

                    Case 10

                        NumeroTexto = "diez"

                    Case 11

                        NumeroTexto = "once"

                    Case 12

                        NumeroTexto = "doce"

                    Case 13

                        NumeroTexto = "trece"

                    Case 14

                        NumeroTexto = "catorce"

                    Case 15

                        NumeroTexto = "quince"

                    Case 16

                        NumeroTexto = "dieciséis"

                    Case 17

                        NumeroTexto = "diecisiete"

                    Case 18

                        NumeroTexto = "dieciocho"

                    Case 19

                        NumeroTexto = "diecinueve"

                    Case 20

                        NumeroTexto = "veinte"

                End Select

            Case Numero To 100

                Select Case Numero

                    Case Numero To 30

                        If Numero < 30 Then

                            NumeroTexto = "veinti" + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "treinta"

                        End If

                    Case Numero To 40

                        If Numero < 40 Then

                            NumeroTexto = "treinta y " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "cuarenta"

                        End If

                    Case Numero To 50

                        If Numero < 50 Then

                            NumeroTexto = "cuarenta y " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "cincuenta"

                        End If

                    Case Numero To 60

                        If Numero < 60 Then

                            NumeroTexto = "cincuenta y " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "sesenta"

                        End If

                    Case Numero To 70

                        If Numero < 70 Then

                            NumeroTexto = "sesenta y " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "setenta"

                        End If

                    Case Numero To 80

                        If Numero < 80 Then

                            NumeroTexto = "setenta y " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "ochenta"

                        End If

                    Case Numero To 90

                        If Numero < 90 Then

                            NumeroTexto = "ochenta y " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "noventa"

                        End If

                    Case Numero To 100

                        If Numero < 100 Then

                            NumeroTexto = "noventa y " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "cien"

                        End If

                End Select

            Case Numero To 1000

                Select Case Numero

                    Case Numero To 200

                        If Numero < 200 Then

                            NumeroTexto = "ciento " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "docientos"

                        End If

                    Case Numero To 300

                        If Numero < 300 Then

                            NumeroTexto = "docientos " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "trecientos"

                        End If

                    Case Numero To 400

                        If Numero < 400 Then

                            NumeroTexto = "trecientos " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "cuatrocientos"

                        End If

                    Case Numero To 500

                        If Numero < 500 Then

                            NumeroTexto = "cuatrocientos " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "quinientos"

                        End If

                    Case Numero To 600

                        If Numero < 600 Then

                            NumeroTexto = "quinientos " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "seiscientos"

                        End If

                    Case Numero To 700

                        If Numero < 700 Then

                            NumeroTexto = "seiscientos " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "setecientos"

                        End If

                    Case Numero To 800

                        If Numero < 800 Then

                            NumeroTexto = "setecientos " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "ochocientos"

                        End If

                    Case Numero To 900

                        If Numero < 900 Then

                            NumeroTexto = "ochocientos " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "novecientos"

                        End If

                    Case Numero To 1000

                        If Numero < 1000 Then

                            NumeroTexto = "novecientos " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = "mil"

                        End If

                End Select

                'RichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichie

                'Transformacion de Miles hasta Un Millon

            Case Numero To 1000000

                Select Case Numero

                    Case Numero To 2000

                        If Numero < 2000 Then

                            NumeroTexto = "mil " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = Me.NumeroTexto(2) + " Mil"

                        End If

                    Case Numero To 1000000

                        If Numero < 1000000 Then

                            Temporal = Numero.ToString

                            Select Case Temporal.Length

                                Case 4

                                    Miles = Val(Temporal.Remove(1, 3))

                                    Centenas = Val(Temporal.Remove(0, 1))

                                Case 5

                                    Miles = Val(Temporal.Remove(2, 3))

                                    Centenas = Val(Temporal.Remove(0, 2))

                                Case 6

                                    Miles = Val(Temporal.Remove(3, 3))

                                    Centenas = Val(Temporal.Remove(0, 3))

                            End Select

                            If Centenas > 0 Then

                                NumeroTexto = Me.NumeroTexto(Miles) + " mil " + Me.NumeroTexto(Centenas)

                            Else

                                NumeroTexto = Me.NumeroTexto(Miles) + " mil"

                            End If

                        Else

                            NumeroTexto = "un millon"

                        End If

                End Select

                'RichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichie

                'Transformacion de Millones hasta Millones de Millon

            Case Else

                Select Case Numero

                    Case Numero To 2000000

                        If Numero < 2000000 Then

                            NumeroTexto = "un millon " + Me.NumeroTexto(MenosUnDigito)

                        Else

                            NumeroTexto = Me.NumeroTexto(2) + " millones"

                        End If

                    Case Else

                        'Aun falta la frase Billones, Trillones, Cuatrillones ....

                        'Seguir Implementando

                        'Se presenta un problema cuando se tiene mas de 15 ceros

                        Temporal = Numero.ToString

                        Select Case Temporal.Length

                            Case 7

                                Millones = Val(Temporal.Remove(1, 6))

                                Miles = Val(Temporal.Remove(0, 1))

                            Case Else

                                Index = Temporal.Length - 7

                                Index = Index + 1

                                Millones = Val(Temporal.Remove(Index, 6))

                                Miles = Val(Temporal.Remove(0, Index))

                        End Select

                        If Miles > 0 Then

                            NumeroTexto = Me.NumeroTexto(Millones) + " millones " + Me.NumeroTexto(Miles)

                        Else

                            NumeroTexto = Me.NumeroTexto(Millones) + " millones"

                        End If

                End Select

                'RichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichieRichie

        End Select

        NumeroTexto = Signo + NumeroTexto

        Return NumeroTexto

    End Function

 

El código casi todo esta explicado creo yo, si hay alguna duda o recomendaciones, sean cordiales y háganmelas llegar a mi correo.


Sobre el Autor:

Nombre: Ricardo Bernave LLamocca Choquehuanca

Alias: elMesero

e-Mail: [email protected]

Profesión: Aun de vago en la Universidad

 

 



Compromiso del autor del artículo con el sitio del Guille:

Lo comentado en este artículo está probado (y funciona) con la siguiente configuración:

El autor se compromete personalmente de que lo expuesto en este artículo es cierto y lo ha comprobado usando la configuración indicada anteriormente.

En cualquier caso, el Guille no se responsabiliza del contenido de este artículo.

Si encuentras alguna errata o fallo en algún link (enlace), por favor comunícalo usando este link:

Gracias.


 

Código de ejemplo (comprimido):

 

Fichero con el código de ejemplo: elMesero_NumeroATexto.zip - 40.00 KB

(MD5 checksum: 0E7074E47DEA52230A5AB7541A706608)

 


Ir al índice principal de el Guille