Convertir Numeros entre 1 y 999,999,999 a cadena de texto en ruby (Actualizacion)
   
Linux Solutions Center    
Bienvenido a    :: LINUX SOLUTIONS CENTER ::
México, 
Home Programacion Convertir Numeros entre 1 y 999,999,999 a cadena de texto en ruby (Actualizacion)
Linux Solutions C.
Buscar en Linuxsc
Actualidad
GNU/Linux
Gente en Línea
Tenemos 75 invitados conectado(s)
Acceso



Estadísticas
Ver contenido por hits : 1055062
El Clima
Mar Mie Jue
La encuesta del día
¿Cuál es la Red Social que usas más?
 
Anunciate aquí

Centro de Soluciones Linux

Santa Clara Ocoyucan

KoalaSoft-Sitio de Amigos
Computer Fixers



Convertir Numeros entre 1 y 999,999,999 a cadena de texto en ruby (Actualizacion) PDF Imprimir E-mail Hits: 2117
Domingo, 10 de Agosto de 2008 02:14

 

Hola a todos por aqui nuevamente...

He estado haciendo un proyecto para el cual necesitaba convertir una cantidad a su expresion en cadena de texto en Ruby. 

Preguntando por ahi unos cuates de la lista Rails-ES me dieron un link de un sitio en el cual se hacia algo parecido pero como no les entendi ni papa mejor me puse a hacer el codigo a mi manera asi que aqui lo tienen.

Obviamene esto es perfeccionable y si alguien puede mejorar el codigo le agradeceria me hiciera llegar una copia...

Lo que el codigo realiza es lo siguiente p.e

El numero   12543 lo convierte en  " doce mil quinientos cuarenta y tres"

Las conversiones se realizan entre numeros que van del  1 al 999,999,999

Asi que ahi les va el codigo...

#*******************************************************************************
#Clase Numlet crea objetos los cuales son convertidos a su respectiva
# representaciòn en texto a traves del metodo  a_letra
# p.e
# 2734 = dos mil setecientos treinta y cuatro
#
# Las conversiones se realizan con numeros entre:
# 0 y 999,999,999
#
# Autor:  Faustino Vasquez limon
# Con ayuda de  http://www.ruby-doc.org/
#
#Asi que "COMIENZA EL DESPAPAYE"
#*******************************************************************************

class Numlet
  def initialize(numero)
    @numero = numero.to_s.reverse.split("")
    @i = 0
    @j = 0
    @parte1 = []
    @parte2 = []
    @especial = ""
    @numlet = []
    @bandera=0
    @bandera1=0
    @a =[["uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve"],
      ["diez","veinte","treinta","cuarenta","cincuenta","sesenta","setenta","ochenta","noventa"],       
      ["ciento","doscientos","trescientos","cuatrocientos","quinientos","seiscientos","setecientos","ochocientos","novecientos"]]
  end

  def especial 
    @numlet[@j]  = case @especial
    when "11"then  "once"
   
when "12"then  "doce"
   
when "13"then  "trece"
   
when "14"then  "catorce"
   
when "15"then  "quice"
   
when "16"then  "dieciseis"
   
when "17"then  "diecisiete"
   
when "18"then  "dieciocho"
   
when "19"then  "diecinueve"
   
when "21"then  "veintiun"
   
when "22"then  "veintidos"
   
when "23"then  "veintitres"
   
when "24"then  "veinticuatro"
   
when "25"then  "veinticinco"
   
when "26"then  "veintiseis"
   
when "27"then  "veintisite"
   
when "28"then  "veintiocho"
   
when "29"then  "veintinueve"
    else return 0
    end
  end

  def repetir
    case @numero.length
    when 0..3 then @parte1[0] = @numero[0..@numero.length]
    when 4..6 then @parte1[0] = @numero[0..2];@parte1[1] = @numero[3..@numero.length]
    when 7..9 then @parte1[0] = @numero[0..2];@parte1[1] = @numero[3..5]; @parte1[2] = @numero[6..@numero.length]
    else return 0
    end
  end

  def convierte
    @bandera1=0
    @i=0
    case @bandera
    when 1 then @numlet[@j]="mil";@j+=1
    when 2 then (@parte2.length==1 and @parte2[0]==1) ? @numlet[@j]="millon" : @numlet[@j]="millones";@j+=1
    end
    @especial = [@parte2[@i+1],@parte2[@i]].to_s
    if especial != 0
      @i+=2
      @j+=1
    else
      if @parte2[@i].to_s =="1"
        @numlet[@j]="un"
        @i+=1
        @j+=1
      end
    end
    while @i < @parte2.length
      if @parte2[@i].to_i ==0
        @i+=1
        @bandera1+=1
      else
        if @parte2.length != 1 and @bandera1 ==0
          if @i == 1
            @numlet[@j]="y"
            @j+=1
          end
        end
        @numlet[@j] = @a[@i][@parte2[@i].to_i-1]
        if  @i == 2  and @bandera1==2 and @numlet[@j]=="ciento"
          @numlet[@j]="cien"
        end
        @j+=1
        @i+=1    
      end
    end
    @bandera+=1
  end

  def termina
    @numlet.reverse.join(" ")
  end

  def a_letra
    if  repetir != 0
      @parte1.each do |@parte2|
        convierte
      end
        print "#{termina}\n"
    else
      print "Este numero no puede ser convertido\n"
    end
   end
end

#Por si alguien quiere aventarse la revisada de todos los numeros

1.upto(999999999) do |x|
anum = Numlet.new(x)
anum.a_letra
end


 

Podemos realizar una verificacion de los numeros de la siguiente forma, primero nombrando al archivo num.rb y mandando la salida a otro archivo llamado numeros

fvasquez@fvasquez:~$ ruby num.rb >> numeros

Con lo anterior obtendremos en numeros una lista de todos los nueros comprendidos entre 1 y 999,999,999, esto ultimo es solo para verificacion...

 

"Una disculpa por los codigos que he publicado en este mismo docto anteriormente porque tenian algunos detalles pero este esta ya verificado y corregido...  :)"

Esperando como siempre que este documento les sea de utilidad

 Atte Faustino Vasquez Limon

Linux user

Última actualización el Miércoles, 15 de Abril de 2009 10:46
 








Chinese (T)EnglishGermanGreekKoreanPolishPortugueseSpanish
Linuxsc está disponible ahora.
Linuxsc en Android
QrDroid

Descarga el APK de Linuxsc
Linuxsc RSS.

Tu Futuro... Hoy
Felipe Angeles
Linuxsc en RSS
No. de Visitas
mod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_counter
mod_vvisit_counterHoy480
mod_vvisit_counterAyer1583
mod_vvisit_counterEsta Semana2064
mod_vvisit_counterEste Mes10041
mod_vvisit_counterTotal1019066
News Feeds

Ultimo Reporte
Ranking Linux
http://www.wikio.es