Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Convertir String a Float/Integer (https://www.clubdelphi.com/foros/showthread.php?t=96109)

mRoman 15-02-2023 23:13:37

Convertir String a Float/Integer
 
Hola amigos, buenas tardes.

Acudo a ustedes nuevamente para el siguiente problema.

TRABAJO CON: DELPHI6, FB 2.0, WIN10

Tengo una tabla en FB con ciertos campos, en 1 de ellos declarado como VARCHAR(10), se almacena información ALFABETICA, NUMERICA Y ALFANUMERICA. En este campo existen cadenas numéricas que me interesa convertirlas a numéricas válidas para el tipo NUMERIC(8,2) -importes de depósitos bancarios- estos datos los extraigo desde un documento PDF.

He consultado con SAN GOOGLE y me encontré una sentencia en FB llamada "SIMILIAR TO" que válida si la cadena tiene números, pero estoy usando FB 2.0 y creo q esta sentencia es posterior a mi versión.
https://firebird21.wordpress.com/201...numero-valido/

Y luego me encontré otra forma aqui, pero lo mismo apartir de la version 2.5 de FB la puedo usar.

Ahora estoy viendo si con delphi puedo hacer algo y me encontré con la instrucción "StrToIntDef" que me permite convertir la cadena a un valor integer, pero mis "cantidades" tienen decimales...y obvio me marca error. Lo que estoy pensando -y no quiero llegar ahi- es leer caracter x caracter para válidar si es un número y concatenarlo hasta formar la cantidad del deposito y almacenarlo en OTRO campo con el tipo de dato correcto (numeric).

Bien, pues la cantidad de registros para hacer lo del párrafo anterior son muchos como para leerlos de 1 x 1 y Caracter x Caracter...pero si NO hay otra solución pues ni modo, tendré que hacerlo.

Aqui un ejemplo de los datos almacenados:

Código:

HORA 09:30
PAGO RASTR
CAJA 0071
Suc 870 pa
5,000.00
1,970.00
ESTADO DE
3,574.45

El campo donde se almacenan estos datos es del tipo VARCHAR(10). Como podrán observar en el ejemplo, hay estas cantidades "5,000.00", "1,970.00" y "3,574.45"

Como le harían usd. para convertir o copiar a otro campo las cantidades del ejemplo??...

Estoy haciendo pruebas con "StrToIntDef" y "StringReplace"

Saludos y muchas gracias de antemano.

ElKurgan 16-02-2023 07:18:50

¿Y por qué no pruebas con StrToFloat?

http://www.delphibasics.co.uk/RTL.php?Name=strtofloat


El problema podría estar en el separador decimal, pero también puedes ver como cambiar eso en este hilo:

https://www.clubdelphi.com/foros/showthread.php?t=35109

Saludos

mRoman 16-02-2023 16:27:55

Cita:

Empezado por ElKurgan (Mensaje 550387)
¿Y por qué no pruebas con StrToFloat?

http://www.delphibasics.co.uk/RTL.php?Name=strtofloat


El problema podría estar en el separador decimal, pero también puedes ver como cambiar eso en este hilo:

https://www.clubdelphi.com/foros/showthread.php?t=35109

Saludos

Gracias ElKurgan por contestar.

Conozco la instrucción pero no la he usado, pero que pasará con los datos que son alfabéticos....marcaría error??. Probaré

En cuanto a tu otro link, lo consulte, pero en este caso, me quedaré con StringReplace y rescataré los decimales de otra forma...

Te agradezco mucho tu tiempo.

Saludos.

movorack 16-02-2023 16:45:37

¡Hola, mRoman!

El posible inconveniente (que no lo es del todo) es que manejas Delphi 6, en versiones mas recientes se tiene TryStrToFloat, la cual nos permite validar si el texto se puede convertir a un número. O también en versiones mas recientes puedes usar expresiones regulares para validar texto.

Casimiro Notevi 16-02-2023 17:19:42

Así tienes un tryStrToFloat casero ;)
Código Delphi [-]
Try
  StrToFloat(....)
Except
End;

mRoman 16-02-2023 18:35:23

Cita:

Empezado por movorack (Mensaje 550403)
¡Hola, mRoman!

El posible inconveniente (que no lo es del todo) es que manejas Delphi 6, en versiones mas recientes se tiene TryStrToFloat, la cual nos permite validar si el texto se puede convertir a un número. O también en versiones mas recientes puedes usar expresiones regulares para validar texto.

Si...gracias movorack. Si hay soluciones, en nuevas versiones tanto de Delphi como de Firebird, que me hacen considerar seriamente en ACTUALIZAR en lenguaje y el FB.

Gracias!.

Saludos.

mRoman 16-02-2023 18:36:09

Cita:

Empezado por Casimiro Notevi (Mensaje 550404)
Así tienes un tryStrToFloat casero ;)
Código Delphi [-]
Try
  StrToFloat(....)
Except
End;

Ok...muy bien, lo intentaré.

Gracias Casimiro.

duilioisola 17-02-2023 08:20:41

Estas funciones las uso en mis aplicaciones:

Código Delphi [-]
function StrToFloatDec(s: string; SeparadorDecimal: char): double;
begin
  if (DecimalSeparator <> SeparadorDecimal) then
     s := StringReplace(s, SeparadorDecimal, DecimalSeparator, []);
  Result := StrToFloat(s);
end;

Código Delphi [-]
function StrToFloatDef(s: string; Default: double): double;
begin
  try
     // Quito el separador de miles
     s := Trim(StringReplace(s, ThousandSeparator, '', [rfReplaceAll]));
     if (s = '') then
        Result := Default
     else
        Result := StrToFloat(s);
  except
     Result := Default;
  end;
end;

mRoman 17-02-2023 16:20:21

Cita:

Empezado por mRoman (Mensaje 550410)
Ok...muy bien, lo intentaré.

Gracias Casimiro.

Ok, utilice tu recomendación Casimiro, pero como le hago para que siga con el proceso?. En cuanto encuentra la Excepción se detiene y ya no continua.

Aqui el código con el cual estoy haciendo pruebas:
Código Delphi [-]
procedure TfrmPDF.Panel1Click(Sender: TObject);
var
   Importe_Flo : Real;
   Importe_Str : String;
begin
               //COPIAR IMPORTES NUMERICOS VALIDOS AL CAMPO paso_ing_importe
        try
               qryImportesNoNum.Close;
               qryImportesNoNum.ParamByName('CT').AsString:=''+IntToStr(cbxCT.KeyValue)+'%';
               qryImportesNoNum.Open;
               qryImportesNoNum.Last;
               pBar3.Max:=qryImportesNoNum.RecordCount;
               qryImportesNoNum.First;

               While not(qryImportesNoNum.Eof) do
               begin
                     Importe_Str:=StringReplace(qryImportesNoNum.FieldByName('paso_pdf_importe').AsString,',','',[rfReplaceAll]);
                     StrToFloat(Importe_Str);
                     ShowMessage( Importe_Str);

                    { qryActImporte.Close;
                     qryActImporte.SQL.Clear;
                     qryActImporte.SQL.Add('UPDATE paso '+
                                            'SET paso_ing_importe=:importe '+
                                            'WHERE paso_pdf_id=:id');
                     qryActImporte.ParamByName('id').AsInteger:=qryImportesNoNum.FieldByName('PASO_PDF_ID').AsInteger;
                     qryActImporte.ParamByName('importe').AsFloat:=StrToFloat( StringReplace(qryImportesNoNum.FieldByName('paso_pdf_importe').AsString,',','',[rfReplaceAll]) );
                     qryActImporte.ExecSQL;}
                     qryImportesNoNum.Next;
                     pBar3.Position:=pBar3.Position+1;
               end;
        except
            ON Exception DO
            BEGIN
                Memo2.Lines.Add(chr(13)+'------IMPORTE NO NUMERICO-------');
                Memo2.Lines.Add('Registro No.: '+qryImportesNoNum.FieldByName('paso_pdf_id').AsString);
                Memo2.Lines.Add('Texto Importe: '+qryImportesNoNum.FieldByName('PASO_PDF_IMPORTE').AsString);
            END;
        end;
end;

El TRY debo ponerlo dentro del While??

mRoman 17-02-2023 16:25:21

Cita:

Empezado por duilioisola (Mensaje 550418)
Estas funciones las uso en mis aplicaciones:

Código Delphi [-]
function StrToFloatDec(s: string; SeparadorDecimal: char): double;
begin
  if (DecimalSeparator <> SeparadorDecimal) then
     s := StringReplace(s, SeparadorDecimal, DecimalSeparator, []);
  Result := StrToFloat(s);
end;

Código Delphi [-]
function StrToFloatDef(s: string; Default: double): double;
begin
  try
     // Quito el separador de miles
     s := Trim(StringReplace(s, ThousandSeparator, '', [rfReplaceAll]));
     if (s = '') then
        Result := Default
     else
        Result := StrToFloat(s);
  except
     Result := Default;
  end;
end;


Gracias Duilio por tu aportación y tiempo. Lo checo también.

mRoman 17-02-2023 16:29:46

Me contesto solo...
 
Cita:

Empezado por mRoman (Mensaje 550426)
Ok, utilice tu recomendación Casimiro, pero como le hago para que siga con el proceso?. En cuanto encuentra la Excepción se detiene y ya no continua.

Aqui el código con el cual estoy haciendo pruebas:
Código Delphi [-]
procedure TfrmPDF.Panel1Click(Sender: TObject);
var
   Importe_Flo : Real;
   Importe_Str : String;
begin
               //COPIAR IMPORTES NUMERICOS VALIDOS AL CAMPO paso_ing_importe
        try
               qryImportesNoNum.Close;
               qryImportesNoNum.ParamByName('CT').AsString:=''+IntToStr(cbxCT.KeyValue)+'%';
               qryImportesNoNum.Open;
               qryImportesNoNum.Last;
               pBar3.Max:=qryImportesNoNum.RecordCount;
               qryImportesNoNum.First;

               While not(qryImportesNoNum.Eof) do
               begin
                     Importe_Str:=StringReplace(qryImportesNoNum.FieldByName('paso_pdf_importe').AsString,',','',[rfReplaceAll]);
                     StrToFloat(Importe_Str);
                     ShowMessage( Importe_Str);

                    { qryActImporte.Close;
                     qryActImporte.SQL.Clear;
                     qryActImporte.SQL.Add('UPDATE paso '+
                                            'SET paso_ing_importe=:importe '+
                                            'WHERE paso_pdf_id=:id');
                     qryActImporte.ParamByName('id').AsInteger:=qryImportesNoNum.FieldByName('PASO_PDF_ID').AsInteger;
                     qryActImporte.ParamByName('importe').AsFloat:=StrToFloat( StringReplace(qryImportesNoNum.FieldByName('paso_pdf_importe').AsString,',','',[rfReplaceAll]) );
                     qryActImporte.ExecSQL;}
                     qryImportesNoNum.Next;
                     pBar3.Position:=pBar3.Position+1;
               end;
        except
            ON Exception DO
            BEGIN
                Memo2.Lines.Add(chr(13)+'------IMPORTE NO NUMERICO-------');
                Memo2.Lines.Add('Registro No.: '+qryImportesNoNum.FieldByName('paso_pdf_id').AsString);
                Memo2.Lines.Add('Texto Importe: '+qryImportesNoNum.FieldByName('PASO_PDF_IMPORTE').AsString);
            END;
        end;
end;

El TRY debo ponerlo dentro del While??

Pues eso, me contesto solo.

Coloque el TRY dentro while...y ejecuta sin problema:

Aqui el código:

Código Delphi [-]
procedure TfrmPDF.Panel1Click(Sender: TObject);
var
   Importe_Flo : Real;
   Importe_Str : String;
begin
               //COPIAR IMPORTES NUMERICOS VALIDOS AL CAMPO paso_ing_importe
//        try
               qryImportesNoNum.Close;
               qryImportesNoNum.ParamByName('CT').AsString:=''+IntToStr(cbxCT.KeyValue)+'%';
               qryImportesNoNum.Open;
               qryImportesNoNum.Last;
               pBar3.Max:=qryImportesNoNum.RecordCount;
               qryImportesNoNum.First;

               While not(qryImportesNoNum.Eof) do
               begin
                  try
                     Importe_Str:=StringReplace(qryImportesNoNum.FieldByName('paso_pdf_importe').AsString,',','',[rfReplaceAll]);
                     StrToFloat(Importe_Str);
                     ShowMessage( Importe_Str);

                    { qryActImporte.Close;
                     qryActImporte.SQL.Clear;
                     qryActImporte.SQL.Add('UPDATE paso '+
                                            'SET paso_ing_importe=:importe '+
                                            'WHERE paso_pdf_id=:id');
                     qryActImporte.ParamByName('id').AsInteger:=qryImportesNoNum.FieldByName('PASO_PDF_ID').AsInteger;
                     qryActImporte.ParamByName('importe').AsFloat:=StrToFloat( StringReplace(qryImportesNoNum.FieldByName('paso_pdf_importe').AsString,',','',[rfReplaceAll]) );
                     qryActImporte.ExecSQL;}
                  except
                      ON Exception DO
                      BEGIN
                          Memo2.Lines.Add(chr(13)+'------IMPORTE NO NUMERICO-------');
                          Memo2.Lines.Add('Registro No.: '+qryImportesNoNum.FieldByName('paso_pdf_id').AsString);
                          Memo2.Lines.Add('Texto Importe: '+qryImportesNoNum.FieldByName('PASO_PDF_IMPORTE').AsString);
                      END;
                  end;

                  qryImportesNoNum.Next;
                  pBar3.Position:=pBar3.Position+1;

               end;
end;


La franja horaria es GMT +2. Ahora son las 13:51:56.

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