Convertir números a letras con PHP

Esta clase: EnLetras sirve para convertir un número  decimal a letras. Consta de varios métodos que son llamados desde la misma clase, pero el método principal es:  ValorEnLetras(); el cual recibe 2 parámetros; el primero es un numero decimal y el segundo una cadena de texto, que puede ser el nombre de la moneda en que se esté convirtiendo, ejemplo: Pesos, Dólares o Euros.

 

<?php
class EnLetras
{
var $Void = "";
var $SP = " ";
var $Dot = ".";
var $Zero = "0";
var $Neg = "Menos";

function ValorEnLetras($x, $Moneda )
{
$s="";
$Ent="";
$Frc="";
$Signo="";

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,0,'.','');

$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 ";

$s = $s . $Moneda;

if($Frc != $this->Void)
{
$s = $s . " Con " . $this->SubValLetra(intval($Frc)) . "Centavos";
//$s = $s . " " . $Frc . "/100";
}
return ($Signo . $s . " ");

}


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 1000000: $t = "Millón";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 ------------------------
?>

<?php
$numero_con_decimales=2225.69;
$son=number_format($numero_con_decimales,2,".","");
$V=new EnLetras();
echo $V->ValorEnLetras($son,"d&oacute;lares");
?>

mega2

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s