<?php 
/*
// Numeros
// =======
// 
// Conversiones de numeros PHP
// 
// Clase original de Felix de Jesus Carrillo Celerino (dcreate)
//  https://github.com/dcreate/Numeros/blob/master/letras.php
// 
// 
// Modificada por Miquel Botanch
// 
// Cambios:
// 
//    * He adaptado el código para que muestre dos decimales.
// 
//    * Permite especificar nombres de moneda y de su centésima parte en singular y plural.
// 
//    * Permite de manera opcional substituir un_mil por mil (como en el castellano de España)
// 
//    * Adaptado para que sea directamente compatible con la versión original, por si se actualiza la clase,
//      NO SEA NECESARIO corregir las llamadas a lHa función ValorEnLetras().  (ya que ahora tiene 5 parámetros en vez de 2)
// 
//    * Añadida variable $anadir_MN_al_final para añadir M.N. al final de la cadena (en España no se usa este acrónimo)
//
*/
class EnLetras 
{ 
  var $Void = ""; 
  var $SP = " "; 
  var $Dot = "."; 
  var $Zero = "0"; 
  var $Neg = "Menos"; 
  var $substituir_un_mil_por_mil = true;
  var $anadir_MN_al_final = true;
  var $tratar_decimales = true;
function ValorEnLetras($x, $Moneda_singular, $Moneda_plural="" ,$Centesima_parte_singular="", $Centesima_parte_plural="")  
{ 
    $s=""; 
    $Ent=""; 
    $Frc=""; 
    $Signo=""; 
    
  // para compatibilizar la clase con la version antigua
  $Moneda_plural = ($Moneda_plural == "") ? $Moneda_singular : $Moneda_plural;
  
    if(floatVal($x) < 0) 
     $Signo = $this->Neg . " "; 
    else 
     $Signo = ""; 
     
    if(intval(number_format($x,2,'.','') )!=$x) //<- averiguar si tiene decimales 
      $s = number_format($x,2,'.',''); 
    else 
      $s = number_format($x,2,'.',''); 
        
    $Pto = strpos($s, $this->Dot); 
         
    if ($Pto === false) 
    { 
      $Ent = $s; 
      $Frc = $this->Void; 
    } 
    else 
    { 
      $Ent = substr($s, 0, $Pto ); 
      $Frc =  substr($s, $Pto+1); 
    } 
    if($Ent == $this->Zero || $Ent == $this->Void) 
       $s = "Cero "; 
    elseif( strlen($Ent) > 7) 
    { 
       $s = $this->SubValLetra(intval( substr($Ent, 0,  strlen($Ent) - 6))) .  
             "Millones " . $this->SubValLetra(intval(substr($Ent,-6, 6))); 
    } 
    else 
    { 
      $s = $this->SubValLetra(intval($Ent)); 
    } 
    if (substr($s,-9, 9) == "Millones " || substr($s,-7, 7) == "Millón ") 
       $s = $s . "de "; 
  if($this->substituir_un_mil_por_mil){
    // En el castellano de España en vez de decir "Un Mil" se dice "Mil"
    
    if(substr($s,0,6)=="Un Mil"){
      $s = substr($s,3);
    }
    
  }
  
  // para compatibilizar la clase con la version antigua
  if ( !$this->tratar_decimales ){
    // ignora los decimales i los muestra como XX/100
    
//    $s = $s . $Moneda_singular; 
    $s = $s . (intval(abs($x))==1 ? $Moneda_singular : $Moneda_plural); 
//      if($Frc != $this->Void)
    if($Frc != "00")
      { 
         $s = $s . " " . $Frc. "/100"; 
         //$s = $s . " " . $Frc . "/100"; 
      } 
  }else{  
    $s = $s . (intval(abs($x))==1 ? $Moneda_singular : $Moneda_plural); 
    if($Frc == "00")
      { 
         $s = $s . " con " . $Frc. "/100"; 
         //$s = $s . " " . $Frc . "/100"; 
      } else

    if($Frc != "00"){
      $tmpV = new EnLetras();
      $tmpV->anadir_MN_al_final = false;
      $tmpV->tratar_decimales = false;
      $s.= " con ".$tmpV->ValorEnLetras($Frc, $Centesima_parte_singular,$Centesima_parte_plural,"","");
    }
  }  
//    $letrass=$Signo . $s;
    return ($Signo . $s ).($this->tratar_decimales?"":""); 
    
} 
function SubValLetra($numero)
{ 
    $Ptr=""; 
    $n=0; 
    $i=0; 
    $x =""; 
    $Rtn =""; 
    $Tem =""; 
    $x = trim("$numero"); 
    $n = strlen($x); 
    $Tem = $this->Void; 
    $i = $n; 
     
    while( $i > 0) 
    { 
       $Tem = $this->Parte(intval(substr($x, $n - $i, 1).  
                           str_repeat($this->Zero, $i - 1 ))); 
       If( $Tem != "Cero" ) 
          $Rtn .= $Tem . $this->SP; 
       $i = $i - 1; 
    } 
     
    //--------------------- GoSub FiltroMil ------------------------------ 
    $Rtn=str_replace(" Mil Mil", " Un Mil", $Rtn ); 
    while(1) 
    { 
       $Ptr = strpos($Rtn, "Mil ");        
       If(!($Ptr===false)) 
       { 
          If(! (strpos($Rtn, "Mil ",$Ptr + 1) === false )) 
            $this->ReplaceStringFrom($Rtn, "Mil ", "", $Ptr); 
          Else 
           break; 
       } 
       else break; 
    } 
    //--------------------- GoSub FiltroCiento ------------------------------ 
    $Ptr = -1; 
    do{ 
       $Ptr = strpos($Rtn, "Cien ", $Ptr+1); 
       if(!($Ptr===false)) 
       { 
          $Tem = substr($Rtn, $Ptr + 5 ,1); 
          if( $Tem == "M" || $Tem == $this->Void) 
             ; 
          else
             $this->ReplaceStringFrom($Rtn, "Cien", "Ciento", $Ptr); 
       } 
    }while(!($Ptr === false)); 
    //--------------------- FiltroEspeciales ------------------------------ 
    $Rtn=str_replace("Diez Un", "Once", $Rtn ); 
    $Rtn=str_replace("Diez Dos", "Doce", $Rtn ); 
    $Rtn=str_replace("Diez Tres", "Trece", $Rtn ); 
    $Rtn=str_replace("Diez Cuatro", "Catorce", $Rtn ); 
    $Rtn=str_replace("Diez Cinco", "Quince", $Rtn ); 
    $Rtn=str_replace("Diez Seis", "Dieciseis", $Rtn ); 
    $Rtn=str_replace("Diez Siete", "Diecisiete", $Rtn ); 
    $Rtn=str_replace("Diez Ocho", "Dieciocho", $Rtn ); 
    $Rtn=str_replace("Diez Nueve", "Diecinueve", $Rtn ); 
    $Rtn=str_replace("Veinte Un", "Veintiun", $Rtn ); 
    $Rtn=str_replace("Veinte Dos", "Veintidos", $Rtn ); 
    $Rtn=str_replace("Veinte Tres", "Veintitres", $Rtn ); 
    $Rtn=str_replace("Veinte Cuatro", "Veinticuatro", $Rtn ); 
    $Rtn=str_replace("Veinte Cinco", "Veinticinco", $Rtn ); 
    $Rtn=str_replace("Veinte Seis", "Veintiseís", $Rtn ); 
    $Rtn=str_replace("Veinte Siete", "Veintisiete", $Rtn ); 
    $Rtn=str_replace("Veinte Ocho", "Veintiocho", $Rtn ); 
    $Rtn=str_replace("Veinte Nueve", "Veintinueve", $Rtn ); 
    //--------------------- FiltroUn ------------------------------ 
    If(substr($Rtn,0,1) == "M") $Rtn = "Un " . $Rtn; 
    //--------------------- Adicionar Y ------------------------------ 
    for($i=65; $i<=88; $i++) 
    { 
      If($i != 77) 
         $Rtn=str_replace("a " . Chr($i), "* y " . Chr($i), $Rtn); 
    } 
    $Rtn=str_replace("*", "a" , $Rtn); 
    return($Rtn); 
} 
function ReplaceStringFrom(&$x, $OldWrd, $NewWrd, $Ptr)
{
  $x = substr($x, 0, $Ptr)  . $NewWrd . substr($x, strlen($OldWrd) + $Ptr); 
} 
function Parte($x)
{ 
    $Rtn=''; 
    $t=''; 
    $i=''; 
    Do 
    { 
      switch($x) 
      { 
         Case 0:  $t = "Cero";break; 
         Case 1:  $t = "Un";break; 
         Case 2:  $t = "Dos";break; 
         Case 3:  $t = "Tres";break; 
         Case 4:  $t = "Cuatro";break; 
         Case 5:  $t = "Cinco";break; 
         Case 6:  $t = "Seis";break; 
         Case 7:  $t = "Siete";break; 
         Case 8:  $t = "Ocho";break; 
         Case 9:  $t = "Nueve";break; 
         Case 10: $t = "Diez";break; 
         Case 20: $t = "Veinte";break; 
         Case 30: $t = "Treinta";break; 
         Case 40: $t = "Cuarenta";break; 
         Case 50: $t = "Cincuenta";break; 
         Case 60: $t = "Sesenta";break; 
         Case 70: $t = "Setenta";break; 
         Case 80: $t = "Ochenta";break; 
         Case 90: $t = "Noventa";break; 
         Case 100: $t = "Cien";break; 
         Case 200: $t = "Doscientos";break; 
         Case 300: $t = "Trescientos";break; 
         Case 400: $t = "Cuatrocientos";break; 
         Case 500: $t = "Quinientos";break; 
         Case 600: $t = "Seiscientos";break; 
         Case 700: $t = "Setecientos";break; 
         Case 800: $t = "Ochocientos";break; 
         Case 900: $t = "Novecientos";break; 
         Case 1000: $t = "Mil";break; 
         Case 2000: $t = "Dos Mil";break;
         Case 3000: $t = "Tres Mil";break;
         Case 4000: $t = "Cuatro Mil";break;
         Case 5000: $t = "Cinco Mil";break;
         Case 6000: $t = "Seis Mil";break;
         Case 7000: $t = "Siete Mil";break;
         Case 8000: $t = "Ocho Mil";break;
         Case 9000: $t = "Nueve Mil";break;
         Case 10000: $t = "Diez Mil";break;
         Case 20000: $t = "Veinte Mil";break;
         Case 30000: $t = "Treinta Mil";break;
         Case 40000: $t = "Cuarenta Mil";break;
         Case 50000: $t = "Cincuenta Mil";break;
         Case 60000: $t = "Secenta Mil";break;
         Case 70000: $t = "Setenta Mil";break;
         Case 80000: $t = "Ochenta Mil";break;
         Case 90000: $t = "Noventa Mil";break;
         Case 100000: $t = "Cien Mil";break;
         Case 200000: $t = "Dosciento Mil";break;
         Case 300000: $t = "Treciento Mil";break;
         Case 400000: $t = "Cuatrociento Mil";break;
         Case 500000: $t = "Quinientos Mil";break;
         Case 600000: $t = "Seciento Mil";break;
         Case 700000: $t = "Seteciento Mil";break;
         Case 800000: $t = "Ochociento Mil";break;
         Case 900000: $t = "Noveciento Mil";break;
         Case 1000000: $t = "Un Millón";break;
         Case 2000000: $t = "Dos Millones";break;
         Case 3000000: $t = "Tres Millones";break;
         Case 4000000: $t = "Cuatro Millones";break;
         Case 5000000: $t = "Cinco Millones";break;
         Case 6000000: $t = "Seis Millones";break;
         Case 7000000: $t = "Siete Millones";break;
         Case 8000000: $t = "Ocho Millones";break;
         Case 9000000: $t = "Nueve Millones";break;
         Case 10000000: $t = "Diez Millones";break;

      } 
      If($t == $this->Void) 
      { 
        $i = $i + 1; 
        $x = $x / 1000; 
        If($x== 0) $i = 0; 
      } 
      else 
         break; 
            
    }while($i != 0); 
    
    $Rtn = $t; 
    Switch($i) 
    { 
       Case 0: $t = $this->Void;break; 
       Case 1: $t = " Mil";break; 
       Case 2: $t = " Millones";break; 
       Case 3: $t = " Billones";break; 
    } 
    return($Rtn . $t); 
} 
} 
//-------------- Programa principal ------------------------ 




?>