Colabora |
Conversión de un número a texto[por elMesero]
Fecha: 24/Nov/2008 (21-11-08)
|
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: Segunda: 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:
|
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:
Error en el artículo elMesero_NumeroATexto
Gracias.
Código de ejemplo (comprimido): |
Fichero con el código de ejemplo: elMesero_NumeroATexto.zip - 40.00 KB
|