elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


  Mostrar Mensajes
Páginas: [1]
1  Programación / PHP / Re: Error convertir numero a letras en: 17 Agosto 2017, 09:36 am
Hola he estado mirando con xdebug en sublime y el error esta en

Código:
//--------------------- 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

Código:
If(!($Ptr===false))

siempre pasa a

Código:
else break;

entonces nunca entra y de ahí el error, me puede colaborar con eso, mil gracias.
2  Programación / PHP / Re: Error convertir numero a letras en: 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  Programación / PHP / Error convertir numero a letras en: 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:

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.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines