esto es lo que tengo en el archivo donde llamo la clases para convertir:
Código:
<?php
//Convertimos el total en letras
require_once "Letras.php";
$V=new EnLetras();
$con_letra=strtoupper($V->ValorEnLetras($regv->total_venta,'PESOS'));
?>
con esto tendria en la variable $con_letra el resultado de la conversion
en la clase Letras.php tengo lo siguiente:
Código:
<?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) == "Millon ")
$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 . " MCTE");
}
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 = "Millon";break;
}
If($t == $this->Void)
{
$i = $i ++;
$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);
}
}
?>
y no logro ponerla totalmente funcional.
realice muchas pruebas y obtuve lo siguiente:
0 a 999 funciona
1.000 a 1.999 funciona pero aparece Un Mil y debe ser Mil
de 2.000 a 999.999 no funciona correctamente
1.000.000 a 1.001.999 funciona
1.002.000 a 9.999.999 no funciona correctamente
10.000.000 a 10.001.999 funciona
10.002.000 a 10.999.999 no funciona correctamente
11.000.000 a 11.001.999 funciona
11.002.000 a 11.999.999 no funciona correctamente
12.000.000 a 12.001.999 funciona
12.002.000 a 12.999.999 no funciona correctamente
13.000.000 a 13.001.999 funciona
13.002.000 a 13.999.999 no funciona correctamente
14.000.000 a 14.001.999 funciona
14.002.000 a 14.999.999 no funciona correctamente
15.000.000 a 11.001.999 funciona
15.002.000 a 15.999.999 no funciona correctamente
16.000.000 a 16.001.999 funciona
16.002.000 a 16.999.999 no funciona correctamente
17.000.000 a 17.001.999 funciona
17.002.000 a 17.999.999 no funciona correctamente
18.000.000 a 18.001.999 funciona
18.002.000 a 18.999.999 no funciona correctamente
19.000.000 a 19.001.999 funciona
19.002.000 a 19.999.999 no funciona correctamente
20.000.000 a 20.001.999 funciona
20.002.000 a 29.999.999 no funciona correctamente
.
.
.
y asi sucesivamente
lo que me permite deducir que el error esta en los numeros del 2000 al 999.999
Alguien me puede hechar una manito para solucionarlo
Mil gracias.