Foros del Web » Programando para Internet » PHP »

Decimales sin parte entera [Oracle]

Estas en el tema de Decimales sin parte entera [Oracle] en el foro de PHP en Foros del Web. Amigos del foro: He topado con el siguiente problema, estoy utilizando PHP y Oracle. En mi base de datos manejos datos decimales tales como 7,6 ...
  #1 (permalink)  
Antiguo 13/12/2008, 15:29
 
Fecha de Ingreso: enero-2007
Mensajes: 272
Antigüedad: 17 años, 3 meses
Puntos: 5
Pregunta Decimales sin parte entera [Oracle]

Amigos del foro:

He topado con el siguiente problema, estoy utilizando PHP y Oracle.

En mi base de datos manejos datos decimales tales como 7,6 8,9 , etc..
pero los decimales que no tengan parte entera es decir un 0,8 me muestra esto
.8, esto me esta truncando la parte entera, en este caso el 0.

¿Cómo puedo solucionarlo, alguien sabe algo al respecto.?

Saludos .-
  #2 (permalink)  
Antiguo 13/12/2008, 15:32
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Decimales sin parte entera [Oracle]

Mmm como estas haciendo el despliegue de datos?

Saludos.
  #3 (permalink)  
Antiguo 13/12/2008, 16:14
 
Fecha de Ingreso: enero-2007
Mensajes: 272
Antigüedad: 17 años, 3 meses
Puntos: 5
Respuesta: Decimales sin parte entera [Oracle]

Hola gatorV

Código PHP:
while ($row oci_fetch_assoc($cursor))
    
$productos[] = array_change_key_case($row); 
Rescata los valores del cursor y los agrego a un arreglo.

Y si probamos lo siguiente.

Código PHP:
while ($row oci_fetch_assoc($cursor))
        echo 
$row['ALTO']; 
Me despliega lo siguiente .7 y no 0.7

Gracias...

Edito: Estoy pensando que pueda ser un problema de la función oci_fetch_assoc de Oracle
  #4 (permalink)  
Antiguo 13/12/2008, 16:56
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Decimales sin parte entera [Oracle]

Tal vez el problema sea que estas recibendo un string en lugar de un valor numerico, prueba esto:

echo $row['ALTO'] * 1;
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 13/12/2008, 17:05
 
Fecha de Ingreso: enero-2007
Mensajes: 272
Antigüedad: 17 años, 3 meses
Puntos: 5
Respuesta: Decimales sin parte entera [Oracle]

Cita:
Iniciado por Triby Ver Mensaje
Tal vez el problema sea que estas recibendo un string en lugar de un valor numerico, prueba esto:

echo $row['ALTO'] * 1;

Hola, en cierto punto se arreglo, pero ahora me sale mas decimales

0.70.909090909091

debería salir solo 0.7 y sin usar round, eso creo yo.

algo más debe faltar....con MySQL no me pasaban estas cosas
  #6 (permalink)  
Antiguo 13/12/2008, 17:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Decimales sin parte entera [Oracle]

Haz un var_dump() de tu fila para que veas como estan los datos.

Saludos.
  #7 (permalink)  
Antiguo 13/12/2008, 17:16
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Decimales sin parte entera [Oracle]

PHP tiene a veces algunos problemillas para comparar o manipular variables de tipo float
http://www.php.net/float

Seguramente deberas usar la funcion number_format() para mostrar exactamente lo que quieres.
__________________
- León, Guanajuato
- GV-Foto
  #8 (permalink)  
Antiguo 14/12/2008, 17:47
 
Fecha de Ingreso: enero-2007
Mensajes: 272
Antigüedad: 17 años, 3 meses
Puntos: 5
De acuerdo Respuesta: Decimales sin parte entera [Oracle] Solucionado

Cita:
Iniciado por Triby Ver Mensaje
Seguramente deberas usar la funcion number_format() para mostrar exactamente lo que quieres.
Hola, disculpa, multiplicando el número por -1 se arregla el problema, ese número gigantesco me aparecia por otro echo que estaba haciendo en otra parte.

Pero me quedo con la solución del number_format, con esto aparece bien el dato y me parece una solución mucho más elegante, gracias.

Con respecto al var_dump estimado gatorV me muestra lo siguiente:

string(2) ".7"

¿Sabes que significa eso?, lo único que entiendo es que es una variable tipo string de largo 2 formada por el punto y el número 7.

Gracias estimados por la ayuda, me tenía sorprendido este tema.

Saludos .-
  #9 (permalink)  
Antiguo 14/12/2008, 18:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Decimales sin parte entera [Oracle]

Mmmm entonces checa si hay alguna directiva en Oracle para que te regrese los numeros de forma correcta, ya que a como lo veo el problema viene directo desde Oracle al entregarle los datos a PHP.

Saludos.
  #10 (permalink)  
Antiguo 15/12/2008, 19:09
 
Fecha de Ingreso: enero-2007
Mensajes: 272
Antigüedad: 17 años, 3 meses
Puntos: 5
Respuesta: Decimales sin parte entera [Oracle]

Cita:
Iniciado por GatorV Ver Mensaje
Mmmm entonces checa si hay alguna directiva en Oracle para que te regrese los numeros de forma correcta, ya que a como lo veo el problema viene directo desde Oracle al entregarle los datos a PHP.

Saludos.
No logré encontrar nada satisfactorio, al parecer un pequeño bug, pero como dije antes me queda con la funcion number_format() que me solucionó el problema.

Gracias...
  #11 (permalink)  
Antiguo 09/01/2009, 11:53
 
Fecha de Ingreso: enero-2007
Mensajes: 272
Antigüedad: 17 años, 3 meses
Puntos: 5
Desacuerdo Respuesta: Decimales sin parte entera [Oracle]

Hola.

De nuevo acá, si si, el asunto que la aplicación dejo de funcionar con el number_format en otro servidor oracle, al parecer es el problema del cliente.

Me sigue devolviendo el numero como ,7 en ves de 0,7

¿Alguien que haya solucionado esto?, hasta ahora me he resistido a formatear agregandole un 0 por delante, no es lo óptimo, pero al parecer tendré que recurrir a ello.

Gracias...
  #12 (permalink)  
Antiguo 09/01/2009, 13:43
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Decimales sin parte entera [Oracle]

Tampoco te funciona multiplicando por 1?
__________________
- León, Guanajuato
- GV-Foto
  #13 (permalink)  
Antiguo 09/01/2009, 14:12
 
Fecha de Ingreso: enero-2007
Mensajes: 272
Antigüedad: 17 años, 3 meses
Puntos: 5
Respuesta: Decimales sin parte entera [Oracle]

Tampoco....devuelve ,7 y esto lo multiplico por 1 sigue saliendo igual...

En otros sitios también encontré gente que tenía este problema.

Seguiré investigando

Gracias...
  #14 (permalink)  
Antiguo 09/01/2009, 14:13
 
Fecha de Ingreso: enero-2007
Mensajes: 272
Antigüedad: 17 años, 3 meses
Puntos: 5
Respuesta: Decimales sin parte entera [Oracle]

De hecho es un strinfg según el var_dump y como dije anteriormente devuelve

string(2) ".7"

  #15 (permalink)  
Antiguo 09/01/2009, 14:19
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Decimales sin parte entera [Oracle]

Opciones:

floatval() y settype()
__________________
- León, Guanajuato
- GV-Foto
  #16 (permalink)  
Antiguo 09/01/2009, 18:46
 
Fecha de Ingreso: enero-2007
Mensajes: 272
Antigüedad: 17 años, 3 meses
Puntos: 5
De acuerdo Respuesta: Decimales sin parte entera [Oracle]

Triby, te cuento que las funciones que me propusiste no me funcionaron.

Pero encontre esta solución
Código PHP:

function parseFloat($ptString) {
   if (
strlen($ptString) == 0) {
       return 
false;
   }

   
$pString str_replace(" """$ptString);

   if (
substr_count($pString",") > 1)
       
$pString str_replace(","""$pString);

   if (
substr_count($pString".") > 1)
       
$pString str_replace("."""$pString);

   
$pregResult = array();

   
$commaset strpos($pString,',');
   if (
$commaset === false) {$commaset = -1;}

   
$pointset strpos($pString,'.');
   if (
$pointset === false) {$pointset = -1;}

   
$pregResultA = array();
   
$pregResultB = array();

   if (
$pointset $commaset) {
       
preg_match('#(([-]?[0-9]+(\.[0-9])?)+(,[0-9]+)?)#'$pString$pregResultA);
   }
   
preg_match('#(([-]?[0-9]+(,[0-9])?)+(\.[0-9]+)?)#'$pString$pregResultB);
   if ((isset(
$pregResultA[0]) && (!isset($pregResultB[0])
       || 
strstr($preResultA[0],$pregResultB[0]) == 0
      
|| !$pointset))) {
          
$numberString $pregResultA[0];
         
$numberString str_replace('.','',$numberString);
         
$numberString str_replace(',','.',$numberString);
       }
   elseif (isset(
$pregResultB[0]) && (!isset($pregResultA[0])
      || 
strstr($pregResultB[0],$preResultA[0]) == 0
      
|| !$commaset)) {
          
$numberString $pregResultB[0];
         
$numberString str_replace(',','',$numberString);
       }
   else {
       return 
false;
   }
   
$result = (float)$numberString;

   return 
$result;
}

function 
addZero($number){

    if (
substr($number01) == ",")
        
$number "0" $number;

   
$result parseFloat($number);

    return 
$result;


La función addZero la cree yo y la parseFLoat la encontré en la página de php, esta función está posteada por un usuario en la página de PHP.

chekea la función parseFloat....se ve interesante

En mi equipo funciona de maravilla este parche que tuve que poner, jejej, veremos mañana si funciona en el otro server, si es así me despreocupo del juego de caracteres que pueda tener la BD.


Gracias por todo...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:55.