<?php
class NroEnLetra {

private $letra;
private $convertidos=Array();
private $digitos=Array();
private $lugares;
private $decimal;
private $valor;
private $primparte;
private $partedecimal;
	public function __construct($valor,$decimal)
	{
	  $this->valor=$valor;
	  $this->decimal=$decimal;
	  $vale=$valor;
	  $partido=explode(".",$vale);
	  $numero=$partido[0];
	  $this->primparte=$numero;
	 /* if ($partido[1]==0)
	  {
	     $this->partedecimal=sprintf("%+02s",$partido[1]);
	  }else */$this->partedecimal=/*sprintf("%-02s",*/$partido[1];/*);*/
	  if($numero=="")$numero=0;
		$largo=strlen($numero);
		$lugares=ceil($largo/3);
		$this->lugares=$lugares;
		$alreves=strrev($numero);
		for($i=0;$i<$lugares;$i++)
		{
			$dadosvuelta[] =substr($alreves,$i*3,3);
		}
		for($j=0;$j<count($dadosvuelta);$j++)
		{
			$this->digitos[]=strrev($dadosvuelta[$j]);
			
		}
		for ($h=0;$h<count($this->digitos);$h++)
		{
			$this->convertidos[]=$this->convertir($this->digitos[$h]);
			//echo $this->convertir($this->digitos[$h])."<br>";
		}$this->armado($this->convertidos);
			
	}


	private function convertir($numero)
	{
		$unidades=array("uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve",
						"diez","once","doce","trece","catorce","quince","dieciseis","diecisiete",
						"dieciocho","diecinueve","veinte");
		$decenas=array("veinti","treinta","cuarenta","cincuenta","sesenta","setenta","ochenta","noventa");
		$centenas=array("ciento","doscientos","trescientos","cuatrocientos","quinientos","seiscientos",
                    "setecientos","ochocientos","novecientos");
    if ($numero==0||$numero==""){return "cero";}
    elseif ($numero<100)
    {                
      if($numero<=20)
		    return $unidades[$numero-1];
	    else
	    {
        $dec=$numero/10;
        if((int)$dec>2 && $numero%10!=0)$espacio=" y ";
        $unid= $numero%10;
         return $decenas[$dec-2].$espacio.$unidades[$unid-1];  
        $espacio="";    
      }
    }
    else
    {
      $cent=$numero/100;
      if($numero%100>20)
      {
        $dec=($numero%100)/10;
       
        if((int)$dec>2 && ($numero%100)%10)$espacio=" y ";
       
        $unid=($numero%10);
        return $centenas[$cent-1]." ".$decenas[$dec-2].$espacio.$unidades[$unid-1];
        $espacio="";
      }
      else
      {
        $dec=$numero%100;
        $moment=$this->nrosRaros($centenas[$cent-1]." ".$unidades[$dec-1]);
        return $moment;
      }  
          
    }
  }
	public function getLetra()
	{
		if ($this->primparte==0){
			if ($this->decimal>0)
				return "cero con ".$this->decimales($this->partedecimal);
				//return "cero ".$this->decimales($this->partedecimal);
			else return "cero";	}	
		else{return $this->letra;}
	}
	private function nrosRaros($raros)
	{
	  if($raros=="ciento ")$raros="cien";
      return $raros;
  	}
  	private function armado($arreglo)
  	{
  		$contador=count($arreglo);
  		for ($i=$contador;$i>0;$i--)
  		{
        	$momentaneo[] =$this->posiciones($arreglo[$i-1],$i,$arreglo[$i]);
      	}
      for($h=0;$h<$contador;$h++)
      {
         $literal=$literal.$momentaneo[$h]." ";
      }
      if($this->decimal!=0)
      {
  		 $this->letra=$literal." con ".$this->decimales($this->partedecimal);
		  //$this->letra=$literal." ".$this->decimales($this->partedecimal);
      }else{$this->letra=$literal;}
  	}
  	private function posiciones($literal,$posicion,$anterior)
  	{
  		
  	//echo $posicion."<br>";
  	//echo $literal."<br>";
      $nronombre=array("","mil","millon","millones","billon","billones");
      switch ($posicion)
      {
        case 0:
          	$devolver=$nronombre[0];
          	break;
        case 1:
      		if($literal==""||$literal=="cero"){$devolver=$nronombre[0];break;}
          	$devolver=$literal." ".$nronombre[0];
          	break;
        case 2:
          	if($literal==""||$literal=="cero"){$devolver=$nronombre[0];break;}
          	$literal=str_replace("uno","un",$literal);
          	$devolver=$literal." ".$nronombre[1];
          	break;
        case 3:
          	if($literal==""||$literal=="cero")
          	{
          		if($anterior=="cero"){$devolver=$nronombre[0];break;}
          		else {$devolver=$nronombre[0]." ".$nronombre[3];break;}
          	}	
          	$literal=str_replace("uno","un",$literal);
          	if($literal=="un"){$devolver=$literal." ".$nronombre[2];break;}
          	else{
          	/*if($anterior=="cero"){$devolver=$literal." ".$nronombre[2];break;}
          	else {*/$devolver=$literal." ".$nronombre[3];break;}
          //}
        case 4:
          	if($literal==""||$literal=="cero"){$devolver=$nronombre[0];break;}
           	$literal=str_replace("uno","un",$literal);
           	$devolver=$literal." ".$nronombre[1];  
           	break;  
        case 5:
      		if($literal==""||$literal=="cero")
          	{
          		if($anterior=="cero"){$devolver=$nronombre[0];break;}
          		else {$devolver=$nronombre[0]." ".$nronombre[5];break;}
          	}         
          	$literal=str_replace("uno","un",$literal);
      		if($literal=="un"){$devolver=$literal." ".$nronombre[4];break;}
          	else{
          	/*if($anterior=="cero"){$devolver=$literal." ".$nronombre[2];break;}
          	else {*/$devolver=$literal." ".$nronombre[5];break;}
        case 6:
        	if($literal==""||$literal=="cero"){$devolver=$nronombre[0];break;}
            $literal=str_replace("uno","un",$literal);
           	$devolver=$literal." ".$nronombre[1];   
      }
      return $devolver;
   }
   private function decimales($decimal)
   {    
      $redondeado="0.".$decimal;
      $decimo=$this->redondeo($redondeado,$this->decimal);
      $lugares=pow(10,$this->decimal);
      $decimal=$decimo."/".$lugares;
      return $decimal;
   }
   private function redondeo($valor,$lugares)
   {
      $retorno=round($valor*pow(10,$lugares));
      return $retorno;
   }
}  	
/*
function numtoletras($xcifra)
{
    $xarray = array(0 => "Cero",
        1 => "UN", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE",
        "DIEZ", "ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIECISEIS", "DIECISIETE", "DIECIOCHO", "DIECINUEVE",
        "VEINTI", 30 => "TREINTA", 40 => "CUARENTA", 50 => "CINCUENTA", 60 => "SESENTA", 70 => "SETENTA", 80 => "OCHENTA", 90 => "NOVENTA",
        100 => "CIENTO", 200 => "DOSCIENTOS", 300 => "TRESCIENTOS", 400 => "CUATROCIENTOS", 500 => "QUINIENTOS", 600 => "SEISCIENTOS", 700 => "SETECIENTOS", 800 => "OCHOCIENTOS", 900 => "NOVECIENTOS"
    );
//
    $xcifra = trim($xcifra);
    $xlength = strlen($xcifra);
    $xpos_punto = strpos($xcifra, ".");
    $xaux_int = $xcifra;
    $xdecimales = "00";
    if (!($xpos_punto === false)) {
        if ($xpos_punto == 0) {
            $xcifra = "0" . $xcifra;
            $xpos_punto = strpos($xcifra, ".");
        }
        $xaux_int = substr($xcifra, 0, $xpos_punto); // obtengo el entero de la cifra a covertir
        $xdecimales = substr($xcifra . "00", $xpos_punto + 1, 2); // obtengo los valores decimales
    }
 
    $XAUX = str_pad($xaux_int, 18, " ", STR_PAD_LEFT); // ajusto la longitud de la cifra, para que sea divisible por centenas de miles (grupos de 6)
    $xcadena = "";
    for ($xz = 0; $xz < 3; $xz++) {
        $xaux = substr($XAUX, $xz * 6, 6);
        $xi = 0;
        $xlimite = 6; // inicializo el contador de centenas xi y establezco el límite a 6 dígitos en la parte entera
        $xexit = true; // bandera para controlar el ciclo del While
        while ($xexit) {
            if ($xi == $xlimite) { // si ya llegó al límite máximo de enteros
                break; // termina el ciclo
            }
 
            $x3digitos = ($xlimite - $xi) * -1; // comienzo con los tres primeros digitos de la cifra, comenzando por la izquierda
            $xaux = substr($xaux, $x3digitos, abs($x3digitos)); // obtengo la centena (los tres dígitos)
            for ($xy = 1; $xy < 4; $xy++) { // ciclo para revisar centenas, decenas y unidades, en ese orden
                switch ($xy) {
                    case 1: // checa las centenas
                        if (substr($xaux, 0, 3) < 100) { // si el grupo de tres dígitos es menor a una centena ( < 99) no hace nada y pasa a revisar las decenas
                             
                        } else {
                            $key = (int) substr($xaux, 0, 3);
                            if (TRUE === array_key_exists($key, $xarray)){  // busco si la centena es número redondo (100, 200, 300, 400, etc..)
                                $xseek = $xarray[$key];
                                $xsub = subfijo($xaux); // devuelve el subfijo correspondiente (Millón, Millones, Mil o nada)
                                if (substr($xaux, 0, 3) == 100)
                                    $xcadena = " " . $xcadena . " CIEN " . $xsub;
                                else
                                    $xcadena = " " . $xcadena . " " . $xseek . " " . $xsub;
                                $xy = 3; // la centena fue redonda, entonces termino el ciclo del for y ya no reviso decenas ni unidades
                            }
                            else { // entra aquí si la centena no fue numero redondo (101, 253, 120, 980, etc.)
                                $key = (int) substr($xaux, 0, 1) * 100;
                                $xseek = $xarray[$key]; // toma el primer caracter de la centena y lo multiplica por cien y lo busca en el arreglo (para que busque 100,200,300, etc)
                                $xcadena = " " . $xcadena . " " . $xseek;
                            } // ENDIF ($xseek)
                        } // ENDIF (substr($xaux, 0, 3) < 100)
                        break;
                    case 2: // checa las decenas (con la misma lógica que las centenas)
                        if (substr($xaux, 1, 2) < 10) {
                             
                        } else {
                            $key = (int) substr($xaux, 1, 2);
                            if (TRUE === array_key_exists($key, $xarray)) {
                                $xseek = $xarray[$key];
                                $xsub = subfijo($xaux);
                                if (substr($xaux, 1, 2) == 20)
                                    $xcadena = " " . $xcadena . " VEINTE " . $xsub;
                                else
                                    $xcadena = " " . $xcadena . " " . $xseek . " " . $xsub;
                                $xy = 3;
                            }
                            else {
                                $key = (int) substr($xaux, 1, 1) * 10;
                                $xseek = $xarray[$key];
                                if (20 == substr($xaux, 1, 1) * 10)
                                    $xcadena = " " . $xcadena . " " . $xseek;
                                else
                                    $xcadena = " " . $xcadena . " " . $xseek . " Y ";
                            } // ENDIF ($xseek)
                        } // ENDIF (substr($xaux, 1, 2) < 10)
                        break;
                    case 3: // checa las unidades
                        if (substr($xaux, 2, 1) < 1) { // si la unidad es cero, ya no hace nada
                             
                        } else {
                            $key = (int) substr($xaux, 2, 1);
                            $xseek = $xarray[$key]; // obtengo directamente el valor de la unidad (del uno al nueve)
                            $xsub = subfijo($xaux);
                            $xcadena = " " . $xcadena . " " . $xseek . " " . $xsub;
                        } // ENDIF (substr($xaux, 2, 1) < 1)
                        break;
                } // END SWITCH
            } // END FOR
            $xi = $xi + 3;
        } // ENDDO
 
        if (substr(trim($xcadena), -5, 5) == "ILLON") // si la cadena obtenida termina en MILLON o BILLON, entonces le agrega al final la conjuncion DE
            $xcadena.= " DE";
 
        if (substr(trim($xcadena), -7, 7) == "ILLONES") // si la cadena obtenida en MILLONES o BILLONES, entoncea le agrega al final la conjuncion DE
            $xcadena.= " DE";
 
        // ----------- esta línea la puedes cambiar de acuerdo a tus necesidades o a tu país -------
        if (trim($xaux) != "") {
            switch ($xz) {
                case 0:
                    if (trim(substr($XAUX, $xz * 6, 6)) == "1")
                        $xcadena.= "UN BILLON ";
                    else
                        $xcadena.= " BILLONES ";
                    break;
                case 1:
                    if (trim(substr($XAUX, $xz * 6, 6)) == "1")
                        $xcadena.= "UN MILLON ";
                    else
                        $xcadena.= " MILLONES ";
                    break;
                case 2:
                    if ($xcifra < 1) {
                        $xcadena = "CERO PESOS $xdecimales/100 M.N.";
                    }
                    if ($xcifra >= 1 && $xcifra < 2) {
                        $xcadena = "UN PESO $xdecimales/100 M.N. ";
                    }
                    if ($xcifra >= 2) {
                        $xcadena.= " PESOS $xdecimales/100 M.N. "; //
                    }
                    break;
            } // endswitch ($xz)
        } // ENDIF (trim($xaux) != "")
        // ------------------      en este caso, para México se usa esta leyenda     ----------------
        $xcadena = str_replace("VEINTI ", "VEINTI", $xcadena); // quito el espacio para el VEINTI, para que quede: VEINTICUATRO, VEINTIUN, VEINTIDOS, etc
        $xcadena = str_replace("  ", " ", $xcadena); // quito espacios dobles
        $xcadena = str_replace("UN UN", "UN", $xcadena); // quito la duplicidad
        $xcadena = str_replace("  ", " ", $xcadena); // quito espacios dobles
        $xcadena = str_replace("BILLON DE MILLONES", "BILLON DE", $xcadena); // corrigo la leyenda
        $xcadena = str_replace("BILLONES DE MILLONES", "BILLONES DE", $xcadena); // corrigo la leyenda
        $xcadena = str_replace("DE UN", "UN", $xcadena); // corrigo la leyenda
    } // ENDFOR ($xz)
    return trim($xcadena);
}
 
// END FUNCTION
 
function subfijo($xx)
{ // esta función regresa un subfijo para la cifra
    $xx = trim($xx);
    $xstrlen = strlen($xx);
    if ($xstrlen == 1 || $xstrlen == 2 || $xstrlen == 3)
        $xsub = "";
    //
    if ($xstrlen == 4 || $xstrlen == 5 || $xstrlen == 6)
        $xsub = "MIL";
    //
    return $xsub;
}
 
// END FUNCTION
*/
?>

