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;
}
} |