Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-08-2011
Avatar de lmpadron
lmpadron lmpadron is offline
Miembro
 
Registrado: feb 2009
Ubicación: Habana, Cuba
Posts: 204
Poder: 16
lmpadron Va por buen camino
Covertir float int str

Hola amigos

Estoy contruyendo un programilla y me he encontrado un problemilla no vi por ningun lado un StrToFloat . El programilla debe manejar valores de tipo float pero tengo que almacenarlos como string, asi mismo me pasa con los int y es casi una locura

Código:
DBEdit1->Text = FloatToStr(variable + StrToInt(DBEdit2->Text));
en este codigo convierto un string a int no me causa problemas porque el numero que se almacena por su naturaleza siempre va a ser entero, pero hay lugares donde el numero es decimal, asi que voy a necesitar convertirlo a float, si lo convierto a int voy a perder lo que se encuentre despues de la coma.

Como puedo convertirlo ???????

Gracias de antemano
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código.


Cuando miras fijamente al abismo, este te devuelve la mirada


oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_
oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_
oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_
oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_
oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_
ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_
________________________________________________________________________________
Responder Con Cita
  #2  
Antiguo 08-08-2011
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
En la unidad SysUtils existe una función llamada "StrToFloat".

Deberías comentarnos la versión de Delphi que estás usando, ya que sí deberías poder realizar dicha conversión.


Un saludo.
__________________
"La recompensa de una buena acción está en haberla hecho"
Responder Con Cita
  #3  
Antiguo 08-08-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Impadrón.

Lo que te sugiere DarkMan es totalmente correcto, aún en Builder C++.

Ejemplo:
Código:
 
...
/* Almacenar en DBEDit1 el valor de DBEdit2 + 100 */
double variable = 100;
  DBEdit1->Text = FloatToStr(variable + StrToFloat(DBEdit2->Text));
Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 09-08-2011
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
La verdadera pregunta aquí es, porque tienes que almacenar los datos en string? Tal vez si nos explicas el porqué de esto podríamos darte una solución, que te evitara tanta conversión.


Pd. No es natural que un dato se almacene como lo que no es (y ojo porque digo natural, no que este mal).
Responder Con Cita
  #5  
Antiguo 09-08-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por _cero_ Ver Mensaje
La verdadera pregunta aquí es, porque tienes que almacenar los datos en string? Tal vez si nos explicas el porqué de esto podríamos darte una solución, que te evitara tanta conversión.
Pd. No es natural que un dato se almacene como lo que no es (y ojo porque digo natural, no que este mal).
Totalmente de acuerdo _cero_.
Lo que sucede es que a veces son imposiciones sobre ejercicios para practicar el uso de ...

Pero tenes toda la razón, es más simple y eficiente trabajar en forma directa:
Código:
...
  DBEdit1->Field->AsFloat = variable + DBEdit2->Field->AsFloat;
...
Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 10-08-2011
Avatar de lmpadron
lmpadron lmpadron is offline
Miembro
 
Registrado: feb 2009
Ubicación: Habana, Cuba
Posts: 204
Poder: 16
lmpadron Va por buen camino
Hola amigos, gracias por su ayuda

Cita:
Empezado por DarkMan Ver Mensaje
En la unidad SysUtils existe una función llamada "StrToFloat".

Deberías comentarnos la versión de Delphi que estás usando, ya que sí deberías poder realizar dicha conversión.

Un saludo.
DarkMan lo que uso es C++Builder y al parecer el problema era que estaba medio mareado, después de escribir ese post me fui a la casa y al regresar al otro día vi tu post y el de los otros amigos que me han ayudado, al re abrirlo ya me permitía realizar perfectamente la conversión.
Gracias de todas formas


Usando el ejemplo que me postearon (sin convertir tanto por gusto) me devuelve este error

Código:
        if (DBEdit1->Text == "" ||
            DBEdit2->Text == "" ||
            DBEdit3->Text == "" ||
            DBComboBox1->ItemIndex == -1){}
        else
        {
                DBEdit4->Field->AsFloat = DBEdit15->Field->AsFloat +
                                           DBEdit16->Field->AsFloat +
                                           DBEdit21->Field->AsFloat;
        }
Código:
---------------------------
Debugger Exception Notification
---------------------------
Project PROYECTO.exe raised exception class EConvertError with message ''' is not a valid floating point value'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------
Al principio pensé que talves estaba realizando el cálculo antes de que los Edits obtubieran los valores, asi que quite todos los calculos de los eventos donde estaban programados y los puse en un boton, me cerciore de que la información estubiera en los DBEdit y despues di click y .... bueno ahi tienen el resultado !!!

Como nota agregar que los DBEdit están enlazados a un Query y los campos que este Query usa de la BD están definidos en el MySQL como VARCHAR o sea texto.

Alguna Idea ???

por otra parte en lo referente a la convertidera de un lado para otro encontré un error, al principio creba unas variables de tipo Float despues convertia de String a Float (el valor de los DBEdit a las variables) realizaba el calculo y después convertia el resultado de FLoat a String y se lo asignaba al DBEdit que debía contener el valor final.
En algún lugar en todo este reguero algo esta pasando mal. El resultado que regresaba al DBEdit final era visiblemente diferente del resultado que debiera llegar por ejemplo:

Usando los siguientes valores:
DBEdit1 = 225.00
DBEdit2 = 5.4
DBEdit3 = 75.00

y con este codigo
Código:
float a,b,c;
  if (DBEdit1->Text == ""){a = 0;}else{a = StrToFloat(DBEdit1->Text);}
  if (DBEdit2->Text == ""){b = 0;}else{b = StrToFloat(DBEdit2->Text);}
  if (DBEdit3->Text == ""){c = 0;}else{c = StrToFloat(DBEdit3->Text);}

  DBEdit4->Text = FloatToStr(a + b + c);
me da este resultado
DBEdit4 = 305.400000095

Esto es correcto ??

Una última pregunta hay alguna forma de definir cuantos numero decimales (o sea después de la ,) puedo usar en el Float.
O sea alguna forma de definir que mi variable de tipo Float solo use 6 lugares después de la coma

Gracias de antemano
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código.


Cuando miras fijamente al abismo, este te devuelve la mirada


oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_
oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_
oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_
oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_
oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_
ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_
________________________________________________________________________________

Última edición por lmpadron fecha: 10-08-2011 a las 22:32:08.
Responder Con Cita
  #7  
Antiguo 10-08-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola impadrón.


Aunque no tiene que ver con el error ,pero para no complicar tanto la sintáxis, probá el condicional de este modo:
Código:
  if (DBEdit1->Text != "" && DBEdit2->Text != "" && DBEdit3->Text != ""
      && DBComboBox1->ItemIndex != -1){
 DBEdit4->Field->AsFloat = DBEdit15->Field->AsFloat +
                           DBEdit16->Field->AsFloat +
                           DBEdit21->Field->AsFloat;
  }
El error que te arroja es por que alguno de los DBEDits no tiene un valor decimal válido.


En cuanto a tu segunda consulta como está relacionada con lo anterior, te sugiero que verifiques el contenido de los DBEdits.
Por ejemplo:
Código:
double d;
  if(TryStrToFloat(DBEdit1->Text,d) == TRUE )
    DBEdit1->Field->AsFloat = d;
  else
    ShowMessage("Error no es un número decimal");
  ....
Sobre tu tercer consulta, no tiene relación con lo anterior así que te ruego que hagas un nuevo hilo con ella. ("una pregunta un hilo") Guía de estilo

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 10-08-2011 a las 23:15:22.
Responder Con Cita
  #8  
Antiguo 11-08-2011
Avatar de lmpadron
lmpadron lmpadron is offline
Miembro
 
Registrado: feb 2009
Ubicación: Habana, Cuba
Posts: 204
Poder: 16
lmpadron Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola impadrón.


Aunque no tiene que ver con el error ,pero para no complicar tanto la sintáxis, probá el condicional de este modo:
Código:
  if (DBEdit1->Text != "" && DBEdit2->Text != "" && DBEdit3->Text != ""
      && DBComboBox1->ItemIndex != -1){
 DBEdit4->Field->AsFloat = DBEdit15->Field->AsFloat +
                           DBEdit16->Field->AsFloat +
                           DBEdit21->Field->AsFloat;
  }
El error que te arroja es por que alguno de los DBEDits no tiene un valor decimal válido.
Encontré el problema !!!! casi podría gritar EUREKA !!!!!!!!!!!

EL operador logico && (AND) en el ejemplo que me das hace lo mismo que el || (OR) que uso yo, en tu ejemplo escribes dentro del if y yo en el mio dejo el if en blanco y escribo dentro del else (me gusta mas la forma en que tu lo escribiste !!!)


Código:
if (a == "" || b == ""){}
        else
        {
                cualquier cosa
        } 

if (a != "" && b != "")
        {
                cualquier cosa
        }
Con respecto al error de conversion
Lo que sucede es que para evitar las conversiones estamos llamando a FIELD, si aun no se ha guardado nada en la BD entonces nos dara error porque FIELD que pertenece a la BD esta en blanco (o al menos eso creo).
Código:
DBEdit1->Field->AsFloat
Inserté dos registros, despues fui al primero de nuevo, puse el DataSet en Edit Mode y corri el codigo y calculó perfectamente, el problema es que solo lo hace si ya hay algun valor en FIELD, para usar el valor que aun no se ha guardado necesito usar TEXT (o al menos eso creo).

Asi que voy a tener que regresar a las conversiones !!!! por lo que me preocupa el hecho de que no se efectuaran correctamente como explique en mi post anterior

Ahora voy a revisar el segudo codigo que me posteo el amigo ecfisa a ver si con el TRY se resuelve el problema.

Gracias por tu ayuda hermano
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código.


Cuando miras fijamente al abismo, este te devuelve la mirada


oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_
oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_
oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_
oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_
oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_
ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_
________________________________________________________________________________

Última edición por lmpadron fecha: 11-08-2011 a las 14:52:40.
Responder Con Cita
  #9  
Antiguo 11-08-2011
Avatar de lmpadron
lmpadron lmpadron is offline
Miembro
 
Registrado: feb 2009
Ubicación: Habana, Cuba
Posts: 204
Poder: 16
lmpadron Va por buen camino
Hola amigos

Finalmente creo que ya tengo la solucion gracias a todos y en especial a ecfisa

Código:
void __fastcall TForm4::DBNavigator2BeforeAction(TObject *Sender,
      TNavigateBtn Button)
{

double a,b,c;
 if(TryStrToFloat(DBEdit1->Text,a) == TRUE &&
    TryStrToFloat(DBEdit2->Text,b) == TRUE &&
    TryStrToFloat(DBEdit3->Text,c) == TRUE )
 {
  DBEdit4->Text = FloatToStr(a + b + c);
 }
}
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código.


Cuando miras fijamente al abismo, este te devuelve la mirada


oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_
oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_
oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_
oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_
oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_
ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_
________________________________________________________________________________
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
edit Str a float Kamael OOP 7 21-03-2010 22:29:53
FLOAT de los ... no va! vivamotos C++ Builder 7 05-01-2009 23:15:15
Redondeo de Float Nomad Varios 8 11-09-2008 19:20:05
format float() rastafa1 DelphiPACK 1 04-03-2005 07:18:29
Float marianaf Varios 1 24-11-2003 19:44:47


La franja horaria es GMT +2. Ahora son las 19:02:32.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi