Implementamos tecnologia y es asi como lo hacemos

Convertir Numeros a Letras Python

Septiembre 11, 2008 - 3:54 pm - Posted by Camilo Nova

Ahora como pueden ver en mi evidente cambio a Python he reescrito el código que convierte de números a letras en esto (70 lineas de codigo menos que en Java y mas facil de entender):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
UNIDADES = (
    '',
    'UN ',
    'DOS ',
    'TRES ',
    'CUATRO ',
    'CINCO ',
    'SEIS ',
    'SIETE ',
    'OCHO ',
    'NUEVE ',
    'DIEZ ',
    'ONCE ',
    'DOCE ',
    'TRECE ',
    'CATORCE ',
    'QUINCE ',
    'DIECISEIS ',
    'DIECISIETE ',
    'DIECIOCHO ',
    'DIECINUEVE ',
    'VEINTE '
)
DECENAS = (
    'VENTI',
    'TREINTA ',
    'CUARENTA ',
    'CINCUENTA ',
    'SESENTA ',
    'SETENTA ',
    'OCHENTA ',
    'NOVENTA ',
    'CIEN '
)
CENTENAS = (
    'CIENTO ',
    'DOSCIENTOS ',
    'TRESCIENTOS ',
    'CUATROCIENTOS ',
    'QUINIENTOS ',
    'SEISCIENTOS ',
    'SETECIENTOS ',
    'OCHOCIENTOS ',
    'NOVECIENTOS '
)
 
def toWord(number):
 
    """
    Converts a number into string representation
    """
    converted = ''
 
    if not (0 < number < 999999999):
 
        return 'No es posible convertir el numero a letras'
 
    number_str = str(number).zfill(9)
    millones = number_str[:3]
    miles = number_str[3:6]
    cientos = number_str[6:]
 
    if(millones):
        if(millones == '001'):
            converted += 'UN MILLON '
        elif(int(millones) > 0):
            converted += '%sMILLONES ' % __convertNumber(millones)
 
    if(miles):
        if(miles == '001'):
            converted += 'MIL '
        elif(int(miles) > 0):
            converted += '%sMIL ' % __convertNumber(miles)
 
    if(cientos):
        if(cientos == '001'):
            converted += 'UN '
        elif(int(cientos) > 0):
            converted += '%s ' % __convertNumber(cientos)
 
    converted += 'PESOS'
 
    return converted.title()
 
def __convertNumber(n):
    """
    Max length must be 3 digits
    """
    output = ''
 
    if(n == '100'):
        output = "CIEN "
    elif(n[0] != '0'):
        output = CENTENAS[int(n[0])-1]
 
    k = int(n[1:])
    if(k <= 20):
        output += UNIDADES[k]
    else:
        if((k > 30) & (n[2] != '0')):
            output += '%sY %s' % (DECENAS[int(n[1])-2], UNIDADES[int(n[2])])
        else:
            output += '%s%s' % (DECENAS[int(n[1])-2], UNIDADES[int(n[2])])
 
    return output

Etiquetas: , | 20 Comentarios »

Convertir Numeros a Letras en Java

Septiembre 11, 2008 - 2:30 pm - Posted by Camilo Nova

Hace rato que tenia esta clase y ahora que la necesito aprovecho para publicarla. Su funcionalidad es de convertir un numero a su representacion en letras

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/**
 * Esta clase provee la funcionalidad de convertir un numero representado en
 * digitos a una representacion en letras. Mejorado para leer centavos
 * 
 * @author Camilo Nova
 * @version 1.0
 */
public abstract class NumberToLetterConverter {
 
	private static final String[] UNIDADES = { "", "UN ", "DOS ", "TRES ",
			"CUATRO ", "CINCO ", "SEIS ", "SIETE ", "OCHO ", "NUEVE ", "DIEZ ",
			"ONCE ", "DOCE ", "TRECE ", "CATORCE ", "QUINCE ", "DIECISEIS",
			"DIECISIETE", "DIECIOCHO", "DIECINUEVE", "VEINTE" };
 
	private static final String[] DECENAS = { "VENTI", "TREINTA ", "CUARENTA ",
			"CINCUENTA ", "SESENTA ", "SETENTA ", "OCHENTA ", "NOVENTA ",
			"CIEN " };
 
	private static final String[] CENTENAS = { "CIENTO ", "DOSCIENTOS ",
			"TRESCIENTOS ", "CUATROCIENTOS ", "QUINIENTOS ", "SEISCIENTOS ",
			"SETECIENTOS ", "OCHOCIENTOS ", "NOVECIENTOS " };
 
	/**
	 * Convierte a letras un numero de la forma $123,456.32 (StoreMath)
	 * <p>
	 * Creation date 5/06/2006 - 10:20:52 AM
	 * 
	 * @param number
	 *            Numero en representacion texto
	 * @return Numero en letras
	 * @since 1.0
	 */
	public static String convertNumberToLetter(String number) {
		return convertNumberToLetter(StoreMath.parseString(number));
	}
 
	/**
	 * Convierte un numero en representacion numerica a uno en representacion de
	 * texto. El numero es valido si esta entre 0 y 999'999.999
	 * <p>
	 * Creation date 3/05/2006 - 05:37:47 PM
	 * 
	 * @param number
	 *            Numero a convertir
	 * @return Numero convertido a texto
	 * @throws NumberFormatException
	 *             Si el numero esta fuera del rango
	 * @since 1.0
	 */
	public static String convertNumberToLetter(double number)
			throws NumberFormatException {
		String converted = new String();
 
		// Validamos que sea un numero legal
		double doubleNumber = StoreMath.round(number);
		if (doubleNumber > 999999999)
			throw new NumberFormatException(
					"El numero es mayor de 999'999.999, "
							+ "no es posible convertirlo");
 
		String splitNumber[] = String.valueOf(doubleNumber).replace('.', '#')
				.split("#");
 
		// Descompone el trio de millones - ¡SGT!
		int millon = Integer.parseInt(String.valueOf(getDigitAt(splitNumber[0],
				8))
				+ String.valueOf(getDigitAt(splitNumber[0], 7))
				+ String.valueOf(getDigitAt(splitNumber[0], 6)));
		if (millon == 1)
			converted = "UN MILLON ";
		if (millon > 1)
			converted = convertNumber(String.valueOf(millon)) + "MILLONES ";
 
		// Descompone el trio de miles - ¡SGT!
		int miles = Integer.parseInt(String.valueOf(getDigitAt(splitNumber[0],
				5))
				+ String.valueOf(getDigitAt(splitNumber[0], 4))
				+ String.valueOf(getDigitAt(splitNumber[0], 3)));
		if (miles == 1)
			converted += "MIL ";
		if (miles > 1)
			converted += convertNumber(String.valueOf(miles)) + "MIL ";
 
		// Descompone el ultimo trio de unidades - ¡SGT!
		int cientos = Integer.parseInt(String.valueOf(getDigitAt(
				splitNumber[0], 2))
				+ String.valueOf(getDigitAt(splitNumber[0], 1))
				+ String.valueOf(getDigitAt(splitNumber[0], 0)));
		if (cientos == 1)
			converted += "UN";
 
		if (millon + miles + cientos == 0)
			converted += "CERO";
		if (cientos > 1)
			converted += convertNumber(String.valueOf(cientos));
 
		converted += "PESOS";
 
		// Descompone los centavos - Camilo
		int centavos = Integer.parseInt(String.valueOf(getDigitAt(
				splitNumber[1], 2))
				+ String.valueOf(getDigitAt(splitNumber[1], 1))
				+ String.valueOf(getDigitAt(splitNumber[1], 0)));
		if (centavos == 1)
			converted += " CON UN CENTAVO";
		if (centavos > 1)
			converted += " CON " + convertNumber(String.valueOf(centavos))
					+ "CENTAVOS";
 
		return converted;
	}
 
	/**
	 * Convierte los trios de numeros que componen las unidades, las decenas y
	 * las centenas del numero.
	 * <p>
	 * Creation date 3/05/2006 - 05:33:40 PM
	 * 
	 * @param number
	 *            Numero a convetir en digitos
	 * @return Numero convertido en letras
	 * @since 1.0
	 */
	private static String convertNumber(String number) {
		if (number.length() > 3)
			throw new NumberFormatException(
					"La longitud maxima debe ser 3 digitos");
 
		String output = new String();
		if (getDigitAt(number, 2) != 0)
			output = CENTENAS[getDigitAt(number, 2) - 1];
 
		int k = Integer.parseInt(String.valueOf(getDigitAt(number, 1))
				+ String.valueOf(getDigitAt(number, 0)));
 
		if (k <= 20)
			output += UNIDADES[k];
		else {
			if (k > 30 && getDigitAt(number, 0) != 0)
				output += DECENAS[getDigitAt(number, 1) - 2] + "Y "
						+ UNIDADES[getDigitAt(number, 0)];
			else
				output += DECENAS[getDigitAt(number, 1) - 2]
						+ UNIDADES[getDigitAt(number, 0)];
		}
 
		// Caso especial con el 100
		if (getDigitAt(number, 2) == 1 && k == 0)
			output = "CIEN";
 
		return output;
	}
 
	/**
	 * Retorna el digito numerico en la posicion indicada de derecha a izquierda
	 * <p>
	 * Creation date 3/05/2006 - 05:26:03 PM
	 * 
	 * @param origin
	 *            Cadena en la cual se busca el digito
	 * @param position
	 *            Posicion de derecha a izquierda a retornar
	 * @return Digito ubicado en la posicion indicada
	 * @since 1.0
	 */
	private static int getDigitAt(String origin, int position) {
		if (origin.length() > position && position >= 0)
			return origin.charAt(origin.length() - position - 1) - 48;
		return 0;
	}
 
}

Etiquetas: , | 14 Comentarios »

Compartir Codigo Limpiamente

Junio 19, 2008 - 6:05 pm - Posted by Camilo Nova

Desde hace mucho tiempo como desarrollador he tenido problemas con mi código, generalmente en el punto de la desesperación lo que buscamos es ayuda de otra persona que sepa, entonces vamos a foros o a canales de IRC en busca de la respuesta.

Luego de comenzar a aprender Django pase por la misma situación que describo, la de una desorientación total, por tal motivo tuve que recurrir al soporte técnico de mas alto nivel, el IRC, una vez allí recordé un problema que siempre tenia al momento de compartir mi código para que otra persona lo viera, generalmente había que enviarlo como archivo adjunto en un email y se perdía la dinámica de la conversación en este proceso.

Django es desarrollado por genios, y creo que quienes lo usan también lo son, por eso no es raro que hayan creado una aplicación que solventara el problema de compartir el código, simplemente deben usarla para que vean la utilidad, esta en dpaste.com

El uso es sencillo, si se quiere compartir con alguien algún pedazo de código en especial, esta aplicación funciona como un tablero donde se publica el código, se identifica por una URL corta y se comparte con la comunidad por 30 días.

No les parece fantastico?

Etiquetas: , , , | Comente »

Encapsulacion en Python

Junio 10, 2008 - 10:49 am - Posted by Camilo Nova

Seguimos estudiando el lenguaje y ahora introducimos la encapsulacion con el mismo ejemplo de las clases:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/env python
 
# Encapsulacion en python
class Automotor(object) :
    """Clase de la cual heredan las demas y que es del nuevo estilo en python"""
 
    def __init__(self, ensambladora, nombre) :
        self.setEnsambladora(ensambladora)
        self.setNombre(nombre)
        print "Automotor", nombre, "Creado!!!"
 
    def setEnsambladora(self, ensambladora) :
        """Determina la ensambladora"""
        self.__ensambladora = ensambladora
 
    def getEnsambladora(self) :
        """Retorna la ensambladora"""
        return self.__ensambladora
 
    def setNombre(self, nombre) :
        """Determina el nombre del automotor"""
        self.__nombre = nombre
 
    def getNombre(self) :
        """Retorna el nombre del automotor"""
        return self.__nombre
 
    #Determinamos que el unico acceso a las variables es por los metodos
    ensambladora = property(getEnsambladora, setEnsambladora)
    nombre = property(getNombre, setNombre)
 
 
class Carro(Automotor) :
    """Esta clase hereda de Automotor y sus metodos"""
    pass
 
class Motocicleta(Automotor) :
    """Esta clase hereda de Automotor y sus metodos, pero es diferente a Carro"""
    pass
 
if __name__ == '__main__':
    carro = Carro("Toyota", "Celica")
    moto = Motocicleta("Auteco", "Pulsar")
 
    print "\n\n"
    print "El carro es", carro.getNombre()
    print "La moto es", moto.getNombre()

Etiquetas: , | 2 Comentarios »

Herencia en Python

Junio 10, 2008 - 10:31 am - Posted by Camilo Nova

Codigo que muestra el manejo de la herencia en python. Aun me pregunto porque permiten herencia multiple???

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python
 
#Herencia en python
class Automotor :
    """Clase de la cual heredan las demas"""
 
    def __init__(self, ensambladora) :
        self.ensambladora = ensambladora
 
    def printEnsambladora(self) :
        print "La ensambladora es", self.ensambladora
 
class Carro(Automotor) :
    """Esta clase hereda de Automotor y sus metodos"""
    pass
 
class Motocicleta(Automotor) :
    """Esta clase hereda de Automotor y sus metodos, pero es diferente a Carro"""
    pass
 
if __name__ == '__main__':
    carro = Carro("Toyota")
    moto = Motocicleta("Auteco")
 
    carro.printEnsambladora()
    moto.printEnsambladora()

Etiquetas: , | 2 Comentarios »

AxiaCore Blog

Publicidad

Etiquetas

Nosotros Leemos

Comentarios Recientes:

  • Jorge Chávez: Algo que me ha interesado en los últimos días es intentar agregar nuevos widgets en el filtro, que...
  • Jorge Chávez: Excelente post! Sin duda los filtros son un problema con la falta de documentación oficial, pero en lo...
  • CBTIS_102: pzz la vdd python es un programa muy completo y facil, pero a veces los que enseñan python son pesimos,...
  • katerine: CORIDAL SALUDO, ES HERMOSA ESTA LABOR. ME ENCANTARIA SABER LOS DATOS DE LA FUNDACION PARA ACERCARME A...
  • Camilo Nova: Copyright © 2008 AxiaCore S.A.S. – info@axiacore.com – http://axiacore.com

Enlaces Recientes:

Archivo

Admin