Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   guardar text como un float (https://www.clubdelphi.com/foros/showthread.php?t=51573)

mjjj 19-12-2007 18:49:28

guardar text como un float
 
Hola he estado teniendo unos problemas en la forma de mostrar cierta informacion.

En un TEdit, tengo una rutina que agrega los puntos separadores de mil.
La idea es grabar en una tabla el texto escrito en el TEdit.

El campo en donde se guarda el el registro lo defini como number con 2 decimales...

ahora bien cuando trato de guardar el el contenido me tira un error.

Código:

ibtable1.fieldbyname('monto').asfloat:=strtofloat(sedit1.text)
pero esto no esta funcionando...

alguna idea....

enecumene 19-12-2007 18:57:42

Hola, primero que todo tipo de base de datos usas? generalemente se usan campos tipo Double o Float no Numero.

Saludos.

Gabo 19-12-2007 19:00:23

Puede que sea Numeric.

¿Cuál es el error que te da? ¿No será algo de puntos y comas?

Caral 19-12-2007 19:06:32

Hola
Cita:

ibtable1.fieldbyname('monto').asfloat:=FloatToStr(sedit1.text)
o
Cita:

ibtable1.fieldbyname('monto').asString:=FloatToStr(sedit1.text)
o
Cita:

ibtable1.fieldbyname('monto').asString:=QuotedStr(sedit1.text)
Me parece que esta al revés, no se?
Saludos

mjjj 19-12-2007 19:26:12

Utilizo Firebird 2.0.1... Cambie el campo a double precision

me dice : '15.202 is not a valid floating point value'

al parecer tengo que sacarle el punto separador de los miles...

o exite otra forma de grabar el registro directamente?

Caral 19-12-2007 19:31:02

Hola
Usas windows?
Si es asi el problema esta en la configuracion regional.
Saludos

Delphius 19-12-2007 19:35:56

La otra opción, para no alterar la configuración es emplear la variable DecimalSeparator.

Código:

DecimalSeparator := '.';
Para mayor información, selecciona la variable y presiona F1.

Saludos,

mjjj 19-12-2007 19:37:47

hola... le cambie el formato separador de los decimales a '.' y funciono.

Pero por ejemplo cuando escribo 1.000 (MIL, no uno coma cero cero cero)...
me lo toma como 1... igual quiero que me mantenga el punto separador de los miles (.) y que me lo diferencie de la coma decimal como si fuera una coma....

se puede lograr eso??

Gracias

aqui les agrego la rutina que utilizo para agregar punto de los miles

En el eveto onChenge del TEdit

Código:

var
i : integer;
aux,aux2,cad : string;
begin
        cad:='0123456789';
        aux2:='';
        with (Sender as TEdit) do
        begin
          if text <> '' then
            begin
                aux:=text;
                if aux[1]='0' then delete(aux,1,1);
                for i:=1 to length(aux) do
                begin
                        if pos(aux[i],cad)>0 then aux2:=aux2+aux[i];
                end;
                i:=1;
                repeat
                        if (i mod 4=0) then Insert('.',aux2,length(aux2)-i+2);
                        inc(i);
                until (i>length(aux2));
                text:=aux2;
                SelStart:=length(aux2);
          end;
        end;


Caral 19-12-2007 19:42:58

Hola
Yo creo que lo que pretendes es que lq presentacion sea con un punto en los miles y me parece bien, pero por que grabarlos de esa forma?.
No creo que el campo de la base de datos lo acepte, no se?
Saludos

Delphius 19-12-2007 19:51:16

Efectivamente, el amigo Caral tiene razón. Una cosa es el formato de presentación y otra lo que se guarda en una base de datos.

mjjj, No puedes hacer que guarde con los puntos de miles. Ne to lo aceptará.
Lo que guardes en cualquier base de datos debe estar expresado sin separadores de miles, el único separador permitido es el decimal. Pues es el necesario para distinguir la parte entera de la decimal.

La otra opción, si queres guardarlo con los separadores de miles es que lo guardes con formato VARCHAR. Pero si después debes recuperarlo y realizar operaciones tendrás que quitarles los puntos. y transformar dicho valor.

Por otro lado...
¿De que manera lo estás insertando?
Dependiendo de esto te podremos sugerir alternativas para conseguir lo que buscas.

Saludos,

mjjj 19-12-2007 20:14:09

justamente eso es lo que me pasa... por lo tanto dejo los campos como varchar.

Ahora bien... para solucionar todos mis problemas, necesito 2 rutinas... aer si me pueden dar una manito...

1) que me agregue los puntos separadores de los miles automaticamente al ingresar cierto numero en un TEdit. y que al presionar el punto del teclado numerico que agrege la coma decimal, representada como una coma (,).

2) una rutina que me transforme un string, por ejemplo (25.006,67) al numero real que corresponda y asi poder hacer calculos con el.

para esto yo utilizaba, la siguiente rutina, pero en la cual no existian la coma deciamal

Cita:

begin
CADENA:=IBQUERY3.FieldByName('MONTO').ASSTRING;
result:=0;
for H:=1 to length(cadena) do
if cadena[H] in ['0'..'9'] then result:=result*10+ord(cadena[H])-48;
en donde cadena es un string y result es un integer... ahora lo que necsito es que me entregue un numero real.

Aer si es que me pueden ayudar.. muchas gracias

Caral 19-12-2007 20:27:36

Hola
Me parece que te equivocas al dejar el campo como varchar, para mi lo correcto es que sea float, ya veras en las peripecias que te metes en cuanto necesites hacer algun calculo con ese campo, es mi opinion.
Yo en la particualr lo que haria:
Dejo el campo float (doble).
Dejo que se introduzcan los numeros sin punto de mil (lo uso asi y no tengo ningun problema).
Y graba los datos tal cual son, osea dobles y con punto decimal (modificando la configuracion reginal, que no tiene gran ciencia).
Es nada mas mi opinion.
Saludos

enecumene 19-12-2007 20:34:34

Cita:

Empezado por Caral (Mensaje 253568)
Hola
Me parece que te equivocas al dejar el campo como varchar, para mi lo correcto es que sea float, ya veras en las peripecias que te metes en cuanto necesites hacer algun calculo con ese campo, es mi opinion.
Yo en la particualr lo que haria:
Dejo el campo float (doble).
Dejo que se introduzcan los numeros sin punto de mil (lo uso asi y no tengo ningun problema).
Y graba los datos tal cual son, osea dobles y con punto decimal (modificando la configuracion reginal, que no tiene gran ciencia).
Es nada mas mi opinion.
Saludos

Estoy totalmente de acuerdo con el amigo Caral, es algo complicado tratar con numeros en un campo varchar, yo tambien uso el campo como Double o Float como ya te habia comentado anteriormente.

Saludos.

mjjj 19-12-2007 21:26:07

gracias por todo... al final deje la el registro como un double presicion y todo funciona perfecto...

una ultima cosa.... cuando utilizo el ibexpert para revisar la tabla me aparece un registro asi: 1.500,56... perfecto tal como yo lo queria, pero cuando utilizo un TDbgrid para mostrar la informacion me aprece asi: 1500,56... sin el punto separador de los miles...


se puede hacer algo con eso????

gracias

Caral 19-12-2007 21:29:17

Hola
Hay un dicho que dice:
Si funciona, mejor ni lo toco, luego lo rompo.:D;)
Por lo menos a mi me pasa.:D:D
Saludos

enecumene 19-12-2007 21:36:27

Hola en el display format de los campos persistentes de los IbExperts puedes poner una mascara de esta forma #.##0,00.

Saludos.

mjjj 19-12-2007 23:10:54

.... no entendi nada... explicame con un poco mas de detalle porfa...

mi tabla se llama compras... y el campo monto

Utilizo el IBExpert


... lo otro...

estoy grabando un registro en la tabla compras, registro monto... de la siguiente manera[code]

Código:

ibtable1.fieldbyname('monto').asfloat:=strtofloat(sedit1.text) ;
el problema es que el texto del sedit1 es or ejemplo: 15.256,56.... y eso no me lo agarra como un numero.

alguien tiene una idea de como quitarle el punto...

espero me puedan ayudar.... y muchas gracias por su tiempo

afxe 20-12-2007 11:44:17

¿Usas campos persistentes?
 
Hola.. enecumene tiene razón... No obstante, por lo que estoy viendo de tu código, me parece que no estás usando campos persistentes, no sé si por desconocimiento o por imposibilidad (porque no sepas en modo de diseño que campos va a tener la tabla), pero échale un ojo. Si usas campos persistentes tienes la posibilidad de usar las propiedesdes DisplayFormat y EditMask para indicar al delphi como controlar la visualización y edición de tus campos numéricos. Si necesitas hacer algo más complejo, te vas a los métodos OnGetText y OnSetText, y ahí podrás hacer lo que quieras, pero para el tratamiento de floats normales, incluso del tipo currency, te bastará con manejarte con las propiedades.
Saludos.


La franja horaria es GMT +2. Ahora son las 06:14:51.

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