Convertir Numeros a Letras en Java

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

Tags: ,

43 De respuestas a “Convertir Numeros a Letras en Java”

  1. Anonimo 4 noviembre, 2008 en 9:23 AM #

    Saludos Camilo Nova y gracias por el codigo fuente que publicaste. Ahora una pregunta porque tengo un problema con el source, ya que tiene un error con la variable “StoreMath” la cual nunca fue declarada y no encuentro de que clase instanciar a este objeto. La pregunta: De que tipo es el objeto “StoreMath” ???. Por otro lado, creo que quisiste con el metodo de la linea 33 [String convertNumberToLetter(String number)] invocar al metodo de la linea 51 [String convertNumberToLetter(double number)], pero creo que no va a funcionar porque en la implementacion del metodo de la linea 33 hace que este metodo se llame recursivamente puesto que el valor que recibes como parametro (String number) le aplicas un parseString (no se si se puede hacer esto a un String) invocandose a ella misma.

  2. Camilo Nova 4 noviembre, 2008 en 10:21 AM #

    Hola Anonimo. StoreMath es una clase que me facilita algunas operaciones matematicas, puede ser facilmente reemplazada por Math u otra, no tiene ninguna funcionalidad especial.

    El metodo de la linea 33 recibe una cadena, mientras que el de la linea 55 recibe un ‘double’, la unica funcionalidad del metodo de la linea 33 es convertir la cadena en double y pasarselo al otro metodo, se hizo por efectos de portabilidad, de ninguna manera es una funcion recursiva, no se llama a ella misma.

    Saludos y gracias por comentar

  3. Anonimo 4 noviembre, 2008 en 11:03 AM #

    Saludos Camilo, fijate en lo siguiente, en el metodo de la linea 33 recibes un String y lo vuelves a convertir en un String con el “parceString” que le haces al parametro de entrada, al menos que el metodo “parceString” que invocas sea una implementacion propia de tu clase StoreMath en donde se convierte un String a un Double (que seria un parceDouble). Te comento todo esto porque estoy probando la implementacion que posteaste pero no me funciona para ciertas cifras, como por ejemplo: 986956356, entendiendo que acepta numeros hasta 999999999. Camilo lo que pasa es que requiero una implementacion que me acepte cifras hasta 999999999.99 y estoy tratando de probar si con tu source puedo.
    Gracias por tu pronta respuesta.

  4. Camilo Nova 4 noviembre, 2008 en 11:06 AM #

    Si mira, lo que pasa es que cuando recibia una cadena era de tipo como “123.456.789,00″ tenia un formato de localizacion, lo que hacia StoreMath era quitar esa localizacion y dejar el numero limpio para poderlo trabajar, si quieres no trabajes con el metodo que recibe una cadena, sino trabaja con el que recibe el double directamente.

  5. Anonimo 4 noviembre, 2008 en 11:24 AM #

    Camilo fijate en lo siguiente, ingreso la cifra 816856968.25 (o cualquiera mayor a 9999999) y me da un error [La longitud maxima debe ser 3 digitos], he tratado de modificar el source para solucionar este problema pero todavia no he dado con la solucion. Si puedes por favor prueba y me indicas que resultado te dio.

    Te agradezco mucho la ayuda.

  6. Anonimo 4 noviembre, 2008 en 2:23 PM #

    Ya se cual es el problema Camilo, y es el siguiente: cuando la cantidad excede de 9999999 los valores declarados tipo double pasan a notacion cientifica (Ej: 1.0856968E7) y el split es realizado mal… Estoy intentando solucionarlo…

  7. Camilo Nova 5 noviembre, 2008 en 7:16 AM #

    muy buen punto, que bueno que ya lo solucionaste

  8. None 31 diciembre, 2008 en 3:04 PM #

    Intenté utilizar el código para convertir un tipo “Double” (con centavos) a la representación en texto. Me convertía muy bien la cantidad a excepcion de los centavos, tuve que hacer la siguiente modificación:

    En el metodo “convertNumberToLetter(double number)” primero se redondea el numero Double enviado para verificar si se puede convertir, y posteriormente sobre ese numero redondeado se hacen las operaciones (por lo que se pierden los centavos en el redondeo)… la solucion es simplemente cambiar lo siguiente:
    * String splitNumber[] = String.valueOf(doubleNumber).replace(‘.’, ‘#’).split(“#”);
    por:
    * String splitNumber[] = String.valueOf(number).replace(‘.’, ‘#’).split(“#”);

    Saludos

  9. NarutoUxu 25 agosto, 2009 en 10:17 AM #

    Hola q tal a todos.,

    Alguien q me pueda faciliar esta clase ya modificada para poder implementarla.

    Saludos y Gracias.

  10. Llamas 29 agosto, 2009 en 7:07 PM #

    Parece que encontré una posible solución para que tome un valor a convertir hasta “999999999.99″ pero Solo con 2 decimales, lo probé y funcionó correctamente.

    Lo único que hice fue cambiar los tipos de datos que reciben los métodos y le di formato al valor double para que quite la notacion científica con String.format(“%.2f”,number);

    el código modificado lo dejo en el siguiente link.

    http://paste2.org/p/405558

  11. Llamas 29 agosto, 2009 en 7:13 PM #

    Si encuentran alguna mejor solución o alguna mejora, por favor publiquenla.

  12. ghro 9 octubre, 2009 en 10:31 PM #

    hola, alguien se maneja con netbeans??

    como para colocar este metodo.

    Gracias y son secos!!

  13. Arnuls 31 octubre, 2009 en 4:36 PM #

    Gracias chicos por la aportacion funciona de maravilla…
    Saludos

  14. k_lin 2 diciembre, 2009 en 4:07 PM #

    Una pregunta como solucionan el problema de los decimales? o solo lee numeros enteros? porque pongo 12.5 y me sale 13

  15. Daniel Kennedy 19 marzo, 2010 en 1:41 PM #

    Hey!!! Gracias!!!! solo le faltaron los 00/100 o 50/100 jeje y el M.N., a ver si te lo regreso ya con eso :P Saludos!!!

  16. Noe 21 abril, 2010 en 1:48 PM #

    Hola, solo una sugerencia, ya que el propósito de la clase es convertir cantidades de dinero a cadena deberían de utilizar la clase BigDecimal en ves de Double, ya que para manejar dinero no es recomendable utilizar Double o Float, ya que estos pierden precisión cuando se hacen operaciones aritméticas con ellos, saludos

  17. Julian 24 mayo, 2010 en 11:17 AM #

    Hola Camilo!!

    Que debería hacer si el monto que necesito sea mayor a mil millones ej: 6.962’414.467 ; ya que este es uno de los valores que probé y no toma el 6. solo sale NOVECIENTOS SESENTA Y DOS MILLONES……..

    Gracias por la respuesta

  18. Enrique 29 mayo, 2010 en 5:19 PM #

    Que tal.
    Antes que nada felicidades por este codigo, muy buen aporte.
    Pero una duda, haber si me puedes ayudar lo mas pronto posible lo que pasa es que estoy utilizando tu clase para una facturacion y en ves de imprimir las letras de los centavos, el cliente lo quiere en numero bueno si el numero es por ejemplo 256.45 me imprime el 45 pero si tiene un “0″ por ejemplo 256.40, me imprime 256.4 sin el 0 o si es la cantidad 256.04 imprime 256.4 ayudame, como le hago para que me muestre el numero ya sea al inicio o al final. Ya sabes que al cliente lo que pida sino ya lo hubiera dejado como tu clase.
    Espero me puedas ayudar
    de antemano Muchas Gracias……..

  19. Jorge 13 agosto, 2010 en 9:57 PM #

    Muchas gracias por tu codigo fuente esta de la patada

  20. ivan 10 septiembre, 2010 en 4:20 PM #

    como recibo los numero que quiero convertir a letras
    por favor me podrias decir gracias

  21. elio 19 octubre, 2010 en 9:17 AM #

    camilo he tratado de probar tu codigo pero me da error en la linea 34 parseString el metoco Math no coinside con el metodo, que me puedes decir

  22. Camilo Nova 19 octubre, 2010 en 9:21 AM #

    Revisa este comentario y los posteriores http://axiacore.com/2008/09/convertir-numeros-a-letras-en-java/comment-page-1/#comment-646

  23. Sergio 27 octubre, 2010 en 9:02 PM #

    Muchas gracias a Camilo y todos los que aportaron su grano de arena. Felicitaciones. Saludos. Sergio

  24. Sergio 28 octubre, 2010 en 6:54 PM #

    Luego de probarlo encontré que con los centavos terminados en 16, 17, 18, 19 y 20, faltaba un espacio al final. Agregué ese espacio en el array UNIDADES y ahora me funciona correctamente. Acá el código modificado: http://paste2.org/p/1060229
    Muchas gracias a todos. Saludos desde Argentina. Sergio

  25. jesus daniel 24 noviembre, 2010 en 7:00 PM #

    oiie camilo se me hace muy interesante la forma en que programas en java… y pss

    a mi me dejaron un problema parecido a ese
    que es seleccionar un numero con un rango del 1 al 10000 y queluego imprima el numero seleccionado en letra,
    no podrias ayudarme a elabrorarlo….

    porfa responde……

    gracias

  26. Noemi Gabriela Contreras Cabrera 8 diciembre, 2010 en 12:03 PM #

    Gracias por la aportación de todos especialmente a Camilo, el código funciona muy bien

  27. Mindstorm 18 enero, 2011 en 12:46 AM #

    Hola a todos, necesito ayuda con lo siguiente, al ejecutar la instrucción:

    String x = NumberToLetterConverter.convertNumberToLetter(total);

    donde total toma un valor como “3456.90″; (tambien intente con una cadena como “$1,000.23″)

    me lanza el siguiente error:

    Exception in thread “AWT-EventQueue-0″ java.lang.ArrayIndexOutOfBoundsException: -1

    hubicando la línea de código:

    output = CENTENAS[getDigitAt(number, 2) - 1];

    dentreo de la clase :

    public static String convertNumber(String number),

    acaso estoy usando mal el método de la clase o pasándole un valor incorrecto?

    Gracias.

  28. Manuel 28 febrero, 2011 en 7:41 PM #

    Hola,
    Gracias por tu código, simplemente con cambiar PESOS y CENTAVOS por Euros y Centimos, además de reemplazar el signo decimal “.” por la “,” que utilizamos en españa y funciona a la perfección, aunque no utilizo grandes numeros. sinceramente buen trabajo con un código simple, que siempre es lo que mejor funciona. De nuevo gracias

  29. wilder 5 marzo, 2011 en 3:02 PM #

    package wilder.java.ejercicio;

    public class Convertidor {

    private String salida;

    private String numeroConvertido;

    private int numeroAConvertir;

    private int d1 = 0;
    private int d2 = 0;
    private int d3 = 0;
    private int d4 = 0;
    private int d5 = 0;
    private int d6 = 0;
    private int d7 = 0;
    private int d8 = 0;
    private int d9 = 0;

    public Convertidor()
    {
    // Llamada implícita al constructor de Objet
    }

    public Convertidor( int numero )
    {

    convertirNumero( numero );

    }

    public void convertirNumero( int numero )
    {

    establecerNumero( numero);

    salida = “”;
    numeroConvertido = “”;

    if( ( numero >= 0 ) && ( numero = 10 ) && ( numero = 100 ) && ( numero = 1000 ) && ( numero = 10000 ) && ( numero = 100000 ) && ( numero = 1000000 ) && ( numero = 10000000 ) && ( numero = 100000000 ) && ( numero = 1 ) )
    {

    salida += arregloXaIX[ md2 + md1 ]; // 11 – 19

    }

    if( ( md2 == 2 ) && ( md1 >= 0 ) )
    {

    if( md1 == 0 )
    {

    salida+= arregloXX[ md2 ]; // 20

    }

    if( md1 >= 1 )
    {

    salida += arregloII[ md2 ]; // 20 -29

    unDigito( md1); // 20 – 29

    }

    }

    if( ( md2 >= 3 ) && ( md1 >= 0 ) )
    {

    salida += arregloII[ md2 ]; // 30 – 99

    if( md1 >= 1 )
    {

    salida += ” y “; // esta cadena solo se muestra para los numeros treinta ” y ” uno a noventa ” y ” nueve
    //sería algo ilógico decir ” veite ” y ” uno ” o cualquier numero para veinte a veintinueve

    unDigito( md1 ); // 30 – 99

    }

    }

    }

    private void tresDigitos( int md3, int md2, int md1 )
    {

    String arregloIII[] = { “”, “ciento”, “doscientos”, “trescientos”, “cuatrocientos”, “quinientos”, “seiscientos”, “setecientos”, “ochocientos”, “novecientos” };

    String arregloC[] = { “”, “cien” };

    if( ( md3 >= 1 ) && ( md2 == 0 ) && ( md1 == 0 ) ) // determ. si en el numero es 100, 200…900
    {

    if( md3 == 1 )
    {

    salida += arregloC[ md3 ];

    }

    if( md3 >= 2 )
    {

    salida += arregloIII[ md3 ];

    }

    }

    if( ( md3 >= 1 ) && ( md2 == 0 ) && ( md1 >= 1 ) ) // determ. si el numero es 101 ,102, 201, 202… 909
    {

    salida += arregloIII[ md3 ] + ” “;

    unDigito( md1 );

    }

    if( ( md3 >= 1) && ( md2 >= 1 ) && ( md1 >= 0 ) ) // determ. si el numero es 110, 111 0 210 0 211… 999
    {

    salida += arregloIII[ md3 ] + ” “;

    dosDigitos( md2, md1 );

    }

    }

    private void cuatroDigitos( int md4, int md3, int md2, int md1 )
    {

    String arregloM[] = { “”, “mil” };

    if( ( md4 >= 1 ) && ( md3 == 0 ) && ( md2 == 0 ) && ( md1 >= 0) ) // dterm. si el numero es 1000 o 1001… 9009
    {

    if( ( md4 == 1 ) && md1 >= 0 )
    {
    if( md1 == 0 )
    {

    salida += arregloM[ md4 ];

    }
    else
    {

    salida += arregloM[ md4 ] + ” “;

    unDigito( md1);

    }
    }

    if( md4 >= 2 && md1 >=0 )
    {

    if( md4 >= 2 )
    {
    unDigito( md4 );

    salida += ” ” + arregloM[ 1 ] ;

    if( md1 >= 1 )
    {
    salida += ” “;

    unDigito( md1 );

    }

    }

    }

    }

    if( ( md4 >= 1 ) && ( md3 == 0 ) && ( md2 >= 1 ) && ( md1 >= 0) ) // determ. si el numero es 1010 a 1099 o 9010 a 9099
    {

    if( md4 == 1 )
    {

    salida += arregloM[ md4 ] + ” “;

    dosDigitos( md2, md1 );

    }

    if( md4 >= 2 )
    {

    unDigito( md4);

    salida += ” ” + arregloM[ 1 ] + ” “;

    dosDigitos( md2, md1 );

    }

    }

    if( ( md4 >= 1 ) && ( md3 >= 1 ) && ( md2 >= 0 ) && ( md1 >=0 ) ) // determ. si el numero es 1100 a 1900
    {

    if( md4 == 1 )
    {

    salida += arregloM[ md4 ] + ” “;

    tresDigitos( md3, md2, md1 );

    }

    if( md4 >= 2 )
    {
    unDigito( md4 );

    salida += ” ” + arregloM[ 1 ] + ” “;

    tresDigitos( md3, md2, md1 );

    }
    }
    }

    private void cincoDigitos( int md5, int md4, int md3, int md2, int md1 )
    {

    String arregloM[] = { “”, “mil” };

    String arregloOpcional[] = { “”, ” un”, };

    if( ( md5 >= 1 ) && ( md4 >= 0 ) && ( md3 == 0 ) && ( md2 >= 0 ) && ( md1 >= 0 ) )
    {

    dosDigitos( md5, md4 );

    if( md4 == 1 )
    {

    salida = salida.replace( “uno”, arregloOpcional[ md4 ] );

    }

    salida += ” ” + arregloM[ 1 ];

    if( ( md2 == 0 ) && ( md1 != 0 ) )
    {
    salida += ” “;

    unDigito( md1 );

    }

    if( ( md2 >= 1 ) && ( md1 >= 0 ) )
    {

    salida += ” “;

    dosDigitos( md2, md1 );

    }

    }

    if( ( md5 >= 1 ) && ( md4 >= 0 ) && ( md3 >= 1 ) && ( md2 >= 0 ) && ( md1 >= 0 ) )
    {

    dosDigitos( md5, md4 );
    if( md4 == 1 )
    {

    salida = salida.replace( “uno”, arregloOpcional[ md4 ] );

    }

    salida += ” ” + arregloM[ 1 ] + ” “;

    tresDigitos( md3, md2, md1 );

    }

    }

    private void seisDigitos( int md6, int md5, int md4, int md3, int md2, int md1 )
    {

    String arregloM[] = { “”, “mil” };

    tresDigitos( md6, md5, md4 );

    if( md4 == 1 )
    {

    salida = salida.replace( “uno” , ” un” );

    }

    salida += ” ” + arregloM[ 1 ] + ” “;

    if( ( md3 == 0 ) && ( md2 == 0 ) && ( md1 >= 1 ) )
    {

    unDigito( md1 );

    }

    if( ( md3 == 0 ) && ( md2 >= 1 ) && ( md1 >= 0 ) )
    {

    dosDigitos( md2, md1 );

    }

    if( ( md3 >= 1 ) && ( md2 >= 0 ) && ( md1 >= 0 ) )
    {

    tresDigitos( md3, md2, md1 );

    }

    }

    private void sieteDigitos( int md7, int md6, int md5, int md4, int md3, int md2, int md1 )
    {

    String arregloMi[] = { “”, “millón”, “millones” };

    unDigito( md7 );

    if( md7 == 1 )
    {
    salida = salida.replace( “uno”, ” un” );

    salida += ” ” + arregloMi[ md7 ] +” “;

    }
    else
    salida += ” ” + arregloMi[ 2 ] + ” “;

    ayudaSeisDigitos( md6, md5, md4, md3, md2, md1 );

    }

    private void ayudaSeisDigitos( int md6, int md5, int md4, int md3, int md2, int md1 )
    {

    if( ( md6 == 0 ) && ( md5 == 0 ) && ( md4 == 0 ) && ( md3 == 0 ) && ( md2 == 0 ) && ( md1 >= 1 ) )
    {

    unDigito( md1);

    }

    else if( ( md6 == 0 ) && ( md5 == 0 ) && ( md4 == 0 ) && ( md3 == 0 ) && ( md2 >= 1 ) && ( md1 >= 0 ) )
    {

    dosDigitos( md2 , md1 );

    }

    else if( ( md6 == 0 ) && ( md5 == 0 ) && ( md4 == 0 ) && ( md3 >= 1 ) && ( md2 >= 0 ) && ( md1 >= 0 ) )
    {

    tresDigitos( md3, md2, md1 );

    }

    else if( ( md6 == 0 ) && ( md5 == 0 ) && ( md4 >= 1 ) && ( md3 >= 0 ) && ( md2 >= 0 ) && ( md1 >= 0 ) )
    {

    cuatroDigitos( md4, md3, md2, md1 );

    }
    else if( ( md6 == 0 ) && ( md5 >= 1 ) && ( md4 >= 0 ) && ( md3 >= 0 ) && ( md2 >= 0 ) && ( md1 >= 0 ) )
    {

    cincoDigitos( md5, md4, md3, md2, md1 );

    }

    else if( ( md6 >= 1 ) && ( md5 >= 0 ) && ( md4 >= 0 ) && ( md3 >= 0 ) && ( md2 >= 0 ) && ( md1 >= 0 ) )
    {

    seisDigitos( md6, md5, md4, md3, md2, md1 );

    }

    }

    private void ochoDigitos( int md8, int md7, int md6, int md5, int md4, int md3, int md2, int md1 )
    {
    String m = “millones”;

    dosDigitos( md8, md7);

    if(md7 == 1 )
    {

    salida = salida.replace( “uno”, ” un” );

    }
    salida += ” ” + m + ” “;

    ayudaSeisDigitos( md6, md5, md4, md3, md2, md1 );

    }

    private void nueveDigitos( int md9, int md8, int md7, int md6, int md5, int md4, int md3, int md2, int md1 )
    {

    String m = “millones”;

    tresDigitos( md9, md8, md7 );

    if( md7 == 1 )
    {

    salida = salida.replace( “uno”, ” un” );

    }

    salida += ” ” + m + ” “;

    ayudaSeisDigitos( md6, md5, md4, md3, md2, md1 );

    }

    }

  30. Juan Pablo Garcia 25 marzo, 2011 en 9:36 AM #

    Muchas gracias por el codigo me sirvio bastante. le hice 2 pequeñas modificiones primero un error de java.lang.ArrayIndexOutOfBoundsException: -1 que salia en la linea 115 cuando cogia los decimales.
    La otra modificacion fue la de la notacion cientifica que pone java por defecto a los double, esto se corrigio en la linea 39 poniendo el Locale.US. no se si sea la mejor manera pero me funciono. ademas queda con el Locale que tenia con anterioridad para no dañar el idioma si usan internacionalizacion, sobre todo en paginas jsf. El codigo midificado esta en

    java.lang.ArrayIndexOutOfBoundsException: -1

    http://paste2.org/p/1325007

  31. CLINTONFERNANDO 5 mayo, 2011 en 2:16 PM #

    Buen aporte, ademas todos apoyamos para las modificaciones pertinentes, GRACIAS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  32. Turk182 31 mayo, 2011 en 2:04 PM #

    como hago para retornar si por ejemplo tengo un numero de documento 12345678-9 y lo que necesito mostrar es “uno dos tres cuatro cinco seis siete ocho guion nueve”

    podrian ayudarme por favor!

    gracias por adelantado!!!

  33. Sam 16 agosto, 2011 en 10:24 AM #

    Hola!! Quiero usar tu codigo pero no me imprime los centavos, redondea el numero! Como le hago?

  34. Berna 30 agosto, 2011 en 2:31 PM #

    wilder podrias colocar todo el codigo faltan metodos

  35. Alex 30 agosto, 2011 en 2:34 PM #

    Camilo cual fue la solucion para el problema que pasaba cuando la cantidad excedia 9999999 los valores declarados tipo double pasaban a notacion cientifica !!!! y da el siguiente error La longitud maxima debe ser 3 digitos

  36. Juls 7 octubre, 2011 en 10:59 AM #

    Gracias por el codigo, Excelente aporte, lo modifique para que pueda poner los Centavos en el formato ” 01/100 M.N.”, lo unico que hay que hacer, es en la parte donde vamos por los centavos poner esto …

    if (centavos == 1)
    //converted += ” CON UN CENTAVO”;
    converted += ” 01/100 M.N)”;
    if (centavos > 1 && centavos 9 )
    // converted += ” CON ” + convertNumber(String.valueOf(centavos))
    // + “CENTAVOS”;
    converted += ” ” + String.valueOf(centavos) + “/100 M.N.)”;

  37. LOURDES 13 octubre, 2011 en 5:16 PM #

    como se puede probar la clase desde un formulario es decir para q el formulario envie parámetros y la clase le envie valores al mismo…. porfavor

  38. Luke 14 noviembre, 2011 en 4:10 PM #

    Como llamo a esta clase con el paso de parametros? gracias!

  39. LuisCatu 13 diciembre, 2011 en 9:42 AM #

    Excelente este articulo compadre, me has salvado la vida solo tuve que quitarles la palabra pesos y pasar el parámetro de moneda para que sea multimoneda.
    Gracias.

  40. Jose Luis 27 diciembre, 2011 en 1:07 PM #

    Holas, bueno prinero agradecer por el codigo aqui compatido, y los aportes realizados.

    Bueno para Luke y Lourdes, el paso de paramentros ddesde un Jframe se haría en el metodo

    actionPerformend(ActionEvent acv){
    //este es el campo de un JTextField
    String parametro= textNumero.getText();

    //este es el texto que convirtio el numero literal
    String txtNumero=NumberToLetterConverter.convertNumberToLetter(parametro);

    //mostramos en un el resultado en un JTextArea
    txtRes.append(txtNumero);

    }
    espero les sirva

  41. Freddy Tello 6 abril, 2012 en 10:54 PM #

    Muchas gracias por el código!!

  42. Joaquin Robles 9 abril, 2012 en 8:24 AM #

    Muy buen aporte,
    Sería excelente si adjuntaras una clase de pruebas y versionaras el source con los cambios realizados,
    Saludos

  43. JOseph 23 abril, 2012 en 12:47 PM #

    Gran aporte mchas gracias

Deja una respuesta