martes, 8 de febrero de 2011

De números a letras.

Fuente: El atareao

#! /usr/bin/python
# -*- coding: iso-8859-1 -*-
#
__author__="atareao"
__date__ ="$29-ene-2011$"
#
# <from numbers to letters.>
#
# Copyright (C) 2011 Lorenzo Carbonell
# lorenzo.carbonell.cerezo@gmail.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#
#
import gtk

unidades = []
decenas = []
centenas = []
unidades.append('cero')
unidades.append('uno')
unidades.append('dos')
unidades.append('tres')
unidades.append('cuatro')
unidades.append('cinco')
unidades.append('seis')
unidades.append('siete')
unidades.append('ocho')
unidades.append('nueve')
unidades.append('diez')
unidades.append('once')
unidades.append('doce')
unidades.append('trece')
unidades.append('catorce')
unidades.append('quince')
unidades.append('dieciseis')
unidades.append('diecisiete')
unidades.append('dieciocho')
unidades.append('diecinueve')
unidades.append('veinte')
unidades.append('veintiuno')
unidades.append('veintidos')
unidades.append('veintitres')
unidades.append('veinticuatro')
unidades.append('veinticinco')
unidades.append('veintiseis')
unidades.append('veintisiete')
unidades.append('veintiocho')
unidades.append('veintinueve')
unidades.append('treinta')
decenas.append('')
decenas.append('')
decenas.append('')
decenas.append('')
decenas.append('cuarenta')
decenas.append('cincuenta')
decenas.append('sesenta')
decenas.append('setenta')
decenas.append('ochenta')
decenas.append('noventa')
centenas.append('')
centenas.append('ciento')
centenas.append('doscientos')
centenas.append('trescientos')
centenas.append('cuatrocientos')
centenas.append('quinientos')
centenas.append('seiscientos')
centenas.append('setecientos')
centenas.append('ochocientos')
centenas.append('novecientos')

def is_integer(number):  
    try:
        dummy = int(number)
        return True
    except:
        return False
    return False

def lee_numero(number):
    if not is_integer(number):
        return ''
    intue = int(number)
    number = str(number)
    longit = len(number)
    trios = longit / 3
    if longit < 3:
        if intue < 31:
            numero_leido = unidades[intue]
        elif intue >=31 and intue<=39:
            numero_leido = unidades[30] + ' y ' + unidades[intue - 30]
        elif intue == 40:
            numero_leido = decenas[4]
        elif intue >=41 and intue<=49:
            numero_leido = decenas[4] + ' y ' + unidades[intue - 40]
        elif intue == 50:
            numero_leido = decenas[5]
        elif intue >=51 and intue<=59:
            numero_leido = decenas[5] + ' y ' + unidades[intue - 50]
        elif intue == 60:
            numero_leido = decenas[6]
        elif intue >=61 and intue<=69:
            numero_leido = decenas[6] + ' y ' + unidades[intue - 60]
        elif intue == 70:
            numero_leido = decenas[7]
        elif intue >=71 and intue<=79:
            numero_leido = decenas[7] + ' y ' + unidades[intue - 70]
        elif intue == 80:
            numero_leido = decenas[8]
        elif intue >=81 and intue<=89:
            numero_leido = decenas[8] + ' y ' + unidades[intue - 80]
        elif intue == 90:
            numero_leido = decenas[9]
        elif intue >=91 and intue<=99:
            numero_leido = decenas[9] + ' y ' + unidades[intue - 90]
    elif longit < 4:
        parte_izquierda = number[:1]#number, 1)
        parte_derecha = number[-2:]#Right(number, 2)
        if parte_derecha == '00' and parte_izquierda == '1':
            numero_leido = 'cien'
        else:
            numero_leido = centenas[int(parte_izquierda)] + ' ' + lee_numero(parte_derecha)
    elif longit < 7:
        parte_izquierda = number[:longit-3]#Left(number, longit - 3)
        parte_derecha = number[-3:]#Right(number, 3)
        if int(parte_izquierda) == 0:
            numero_leido = lee_numero(parte_derecha)
        elif int(parte_izquierda) == 1:
            numero_leido = 'mil ' + lee_numero(parte_derecha)
        elif int(parte_izquierda) > 1:
            numero_leido = lee_numero(parte_izquierda) + ' mil ' + lee_numero(parte_derecha)
    elif longit < 13:
        parte_izquierda = number[:longit-6]#Left(number, longit - 6)
        parte_derecha = number[-6:]#Right(number, 6)
        if int(parte_izquierda) == 0:
            numero_leido = lee_numero(parte_derecha)
        elif int(parte_izquierda) == 1:
            numero_leido = 'un millón ' + lee_numero(parte_derecha)
        elif int(parte_izquierda) > 1:
            parte_izquierda = parte_izquierda
            if parte_izquierda[-1:] == '1':#If Right(parte_izquierda, 1) = '1' Then
                numero_leido = lee_numero(parte_izquierda)[:len(lee_numero(parte_izquierda))- 1] + ' millón ' + lee_numero(parte_derecha)#numero_leido = Left(lee_numero(parte_izquierda), Len(lee_numero(parte_izquierda)) - 1) + ' millón ' + lee_numero(parte_derecha)
            else:
                numero_leido = lee_numero(parte_izquierda) + ' millones ' + lee_numero(parte_derecha)
    elif longit < 25:
        parte_izquierda = number[:longit-12]#Left(number, longit - 12)
        parte_derecha = number[-12:]#Right(number, 12)
        if int(parte_izquierda) == 0:
            numero_leido = lee_numero(parte_derecha)
        elif int(parte_izquierda) == 1:
            numero_leido = 'un billón ' + lee_numero(parte_derecha)
        elif int(parte_izquierda) > 1:
                numero_leido = lee_numero(parte_izquierda) + ' billones ' + lee_numero(parte_derecha)
    elif longit < 49:
        parte_izquierda = number[:longit-24]#Left(number, longit - 24)
        parte_derecha = number[-24:]#Right(number, 24)
        if int(parte_izquierda) == 0:
            numero_leido = lee_numero(parte_derecha)
        elif int(parte_izquierda) == 1:
            numero_leido = 'un trillón ' + lee_numero(parte_derecha)
        elif int(parte_izquierda) > 1:
                numero_leido = lee_numero(parte_izquierda) + ' trillones ' + lee_numero(parte_derecha)
    elif longit < 97:
        parte_izquierda = number[:longit-48]#Left(number, longit - 48)
        parte_derecha = number[-48:]#Right(number, 48)
        if int(parte_izquierda) == 0:
            numero_leido = lee_numero(parte_derecha)
        elif int(parte_izquierda) == 1:
            numero_leido = 'un cuatrillón ' + lee_numero(parte_derecha)
        elif int(parte_izquierda) > 1:
                numero_leido = lee_numero(parte_izquierda) + ' cuatrillones ' + lee_numero(parte_derecha)
    elif longit < 193:
        parte_izquierda = number[:longit-96]#Left(number, longit - 96)
        parte_derecha = number[-96:]#Right(number, 96)
        if int(parte_izquierda) == 0:
            numero_leido = lee_numero(parte_derecha)
        elif int(parte_izquierda) == 1:
            numero_leido = 'un quintillón ' + lee_numero(parte_derecha)
        elif int(parte_izquierda) > 1:
                numero_leido = lee_numero(parte_izquierda) + ' quintillones ' + lee_numero(parte_derecha)
    return numero_leido.upper()[:1]+numero_leido.lower()[1:]

class CM(gtk.Dialog): # needs GTK, Python, Webkit-GTK
    def __init__(self,busqueda_inicial = None):
        #
        gtk.Dialog.__init__(self)
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
        self.set_title('number-me')
        self.set_default_size(300, 225)
        self.connect('destroy', self.close_application)
        #
        self.vbox1 = gtk.VBox(spacing = 5)
        self.vbox1.set_border_width(5)
        self.get_content_area().add(self.vbox1)
        #
        self.hbox0 = gtk.HBox(spacing = 5)
        self.hbox0.set_border_width(5)
        self.vbox1.add(self.hbox0)
        #
        self.button0 = gtk.Button('?')
        self.button0.connect('clicked',self.menu_about_response)
        self.hbox0.pack_end(self.button0,False,True)
        #
        self.hbox1 = gtk.HBox(spacing = 5)
        self.hbox1.set_border_width(5)
        self.vbox1.add(self.hbox1)
        #
        self.label = gtk.Label('Número:')
        self.hbox1.pack_start(self.label,False,False)
        #
        self.entry = gtk.Entry()
        self.entry.connect("activate",self.numera)
        self.hbox1.pack_start(self.entry,True,True)
        #
        '''
        self.button = gtk.Button('Numérame')
        self.button.connect('clicked',self.numera)
        self.vbox1.pack_start(self.button,False,False)
        '''
        #
        self.frame0 = gtk.Frame()
        self.vbox1.pack_start(self.frame0,True,True)
        #
        self.scrolledwindow = gtk.ScrolledWindow()
        self.scrolledwindow.set_size_request(200,180)
        self.scrolledwindow.set_border_width(2)
        self.frame0.add(self.scrolledwindow)
        self.textview =gtk.TextView()
        self.scrolledwindow.add(self.textview)#.pack_start(self.textview,True,True)
        #
        self.show_all()
        self.set_focus(self.entry)
        #
        #
        #
    def close_application(self, widget, event, data=None):
        exit(0)
      
    def menu_about_response(self,widget):
        ad=gtk.AboutDialog()
        ad.set_name('number-me')
        ad.set_version('0.2.0')
        ad.set_copyright('Copyrignt (c) 2011\nLorenzo Carbonell')
        ad.set_comments('Una aplicación para pasar de números a letras')
        ad.set_license(''+
        'This program is free software: you can redistribute it and/or modify it\n'+
        'under the terms of the GNU General Public License as published by the\n'+
        'Free Software Foundation, either version 3 of the License, or (at your option)\n'+
        'any later version.\n\n'+
        'This program is distributed in the hope that it will be useful, but\n'+
        'WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n'+
        'or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n'+
        'more details.\n\n'+
        'You should have received a copy of the GNU General Public License along with\n'+
        'this program.  If not, see <http://www.gnu.org/licenses/>.')
        ad.set_website('http://www.atareao.es')
        ad.set_website_label('http://www.atareao.es')
        ad.set_authors(['Lorenzo Carbonell <lorenzo.carbonell.cerezo@gmail.com>'])
        ad.set_documenters(['Lorenzo Carbonell <lorenzo.carbonell.cerezo@gmail.com>'])
        #ad.set_logo(logo)
        #ad.set_logo_icon_name(icon_name)
        ad.set_program_name('number-me')
        ad.run()
        ad.hide()

    def numera(self,widget):
        number = ''
        base = self.entry.get_text()
        base = base.replace('.',',')
        if base.find(',')!=-1:
            entero = base.split(',')
            if len(entero[1])>0:
                number = lee_numero(entero[0]) + ' con ' +lee_numero(entero[1]).lower()
            else:
                number = lee_numero(entero[0])
        else:
            number = lee_numero(self.entry.get_text())
        clipboard = gtk.clipboard_get()
        clipboard.set_text(number)
        ttbuffer=gtk.TextBuffer()
        ttbuffer.set_text(number)
        self.textview.set_buffer(ttbuffer)
        self.textview.set_editable(False)
        self.textview.set_wrap_mode(gtk.WRAP_WORD)
        if number == '':
            self.entry.set_text('')
      
    def on_exit_activate(self,widget):
        exit(0)

if __name__ == "__main__":
    '''
    print lee_numero(0)
    print lee_numero(1)
    print lee_numero(12)
    print lee_numero(123)
    print lee_numero(1234)
    print lee_numero(12345)
    print lee_numero(1234567)
    print lee_numero(12345678)
    print lee_numero(123456789)
    print lee_numero(1234567890)
    print lee_numero(12345678901)
    print lee_numero(123456789012)
    '''
    cm = CM()
    cm.run()
    exit(0)

No hay comentarios:

Publicar un comentario