/**
 * NumeroCastellano - Convierte un número a castellano
 * Copyright (c) 2006 Alexander Hristov .
 * 
 * Este programa es Software Libre; usted puede redistribuirlo
 * y/o modificarlo bajo los términos de la "GNU General Public
 * License" como lo publica la "FSF Free Software Foundation",
 * o (a su elección) de cualquier versión posterior.
 *
 * Este programa es distribuido con la esperanza de que le será
 * útil, pero SIN NINGUNA GARANTIA; incluso sin la garantía
 * implícita por el MERCADEO o EJERCICIO DE ALGUN PROPOSITO en
 * particular. Vea la "GNU General Public License" para más
 * detalles.
 * 
 * Usted debe haber recibido una copia de la "GNU General Public
 * License" junto con este programa, si no, escriba a la "FSF
 * Free Software Foundation, Inc.", 59 Temple Place - Suite 330,
 * Boston, MA  02111-1307, USA.
 * 
 */
public class NumeroCastellano {
  private static String[] _grupos = 
  	{ "", "millon","billon","trillon"  };
  
  private static String[] _unidades = 
  	{ "","un","dos","tres","cuatro","cinco","seis","siete","ocho","nueve" };
  
  private static String[] _decena1 = 
  	{ "","once","doce","trece","catorce","quince",
  	  "dieciseis","diecisiete","dieciocho","diecinueve" };
  private static String[] _decenas = 
  	{ "","diez","veinte","treinta","cuarenta","cincuenta",
  	  "sesenta","setenta","ochenta","noventa"};
  
  private static String[] _centenas = 
  	{ "","cien","doscientos","trescientos","cuatrocientos",
  	  "quinientos","seiscientos","setecientos","ochocientos","novecientos"};
 
  public static String millarATexto( int n ) {
    if (n == 0)
      return "";
      
    int centenas = n / 100;
    n = n % 100;
    int decenas = n / 10;
    int unidades = n % 10;
    
    String sufijo = "";
    
    if ( decenas == 0 && unidades != 0 ) 
      sufijo = _unidades[unidades];
    
    if ( decenas == 1 && unidades != 0 )
      sufijo = _decena1[unidades];
    
    if ( decenas == 2 && unidades != 0 )
      sufijo   = "veinti"+_unidades[unidades];
    
    if ( unidades == 0) 
      sufijo = _decenas[decenas];
    
    if ( decenas > 2 && unidades != 0)
      sufijo = _decenas[decenas] + " y " + _unidades[unidades];
    
    if (centenas != 1)
      return _centenas[centenas] + " " + sufijo;
    
    if ( unidades == 0 && decenas == 0)
      return "cien";
    
    return "ciento "+sufijo; 
  }
  
  

  public static String numeroACastellano( long n  ){
    String resultado = "";
    int grupo = 0;
    while ( n != 0 && grupo < _grupos.length ) {
      long fragmento = n % 1000000;
      int millarAlto = (int) (fragmento / 1000);
      int millarBajo = (int) (fragmento % 1000);
      n = n / 1000000;
      
      String nombreGrupo = _grupos[grupo];
      if (fragmento > 1 && grupo > 0)
        nombreGrupo += "es";
      
      
      if ((millarAlto != 0) || (millarBajo != 0)) {
        if (millarAlto > 1)
           resultado = millarATexto(millarAlto) + " mil " + 
                       millarATexto(millarBajo) + " " +
                       nombreGrupo + " " +
                       resultado;
                    
        
        if (millarAlto == 0) 
          resultado = millarATexto(millarBajo) + " " +
                      nombreGrupo + " "+
                      resultado;
                      
        if (millarAlto == 1)
           resultado = "mil " + millarATexto(millarBajo) + " " +
                       nombreGrupo + " " +
                       resultado;
      }
      grupo++;
    }
    return resultado;
  }
  
  public static void main(String[] args) {
    System.out.println(  numeroACastellano(123) );
  }
}
