Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - pompyarro

#1
PHP / Re: Error convertir numero a letras
17 Agosto 2017, 09:36 AM
Hola he estado mirando con xdebug en sublime y el error esta en


//--------------------- 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;
      }


desde la instrucción


If(!($Ptr===false))


siempre pasa a


else break;


entonces nunca entra y de ahí el error, me puede colaborar con eso, mil gracias.
#2
PHP / Re: Error convertir numero a letras
17 Agosto 2017, 08:14 AM
Amigo soy novato en esto el sistema lo estoy haciendo en php7, todo lo estoy haciendo en sublimetext, me puedes indicar como lo hago, mil gracias
#3
PHP / Error convertir numero a letras
17 Agosto 2017, 07:20 AM
Hola a todos estoy implementando una clase para convertir numeros a letras en php7

esto es lo que tengo en el archivo donde llamo la clases para convertir:


<?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:


<?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($s0$Pto );
        
$Frc =  substr($s$Pto+1);
      }

      if(
$Ent == $this->Zero || $Ent == $this->Void)
        
$s "Cero ";
      elseif( 
strlen($Ent) > 7)
      {
        
$s $this->SubValLetra(intvalsubstr($Ent0,  strlen($Ent) - 6))) .
               
"Millones " $this->SubValLetra(intval(substr($Ent,-66)));
      }
      else
      {
        
$s $this->SubValLetra(intval($Ent));
      }

      if (
substr($s,-99) == "Millones " || substr($s,-77) == "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 $i1).
                           
str_repeat($this->Zero$i )));
        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 ,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($x0$Ptr)  . $NewWrd substr($xstrlen($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.