GARANTIR DESCONTO

Fórum Problema com is not a valid floating point value #454649

10/09/2013

0

Bom dia pessoal, sou novo aqui no fórum e estou com um problema que está me caindo os cabelos... Estou usando esse código:
  
for I := 0 to map.Count - 1 do
      begin
        if FieldByName(map[I]).DataType = ftFloat then
          begin
           FieldByName(map[I]).AsFloat := StrToFloat(StringReplace(valorDoComponente(map.Objects[I], FieldByName(map[I]).DataType), '.', '', [rfReplaceAll, rfIgnoreCase]));     
          end
          else
          begin
            FieldByName(map[I]).Value := valorDoComponente(map.Objects[I], FieldByName(map[I]).DataType);
        end;
      end;


Dai é o seguinte, quando vou salvar os dados na venda ele da o erro do titulo. E eu ja nao sei mais o que fazer... Dicas por favor!

Att.
Marlon Minotti

Marlon Minotti

Responder

Posts

10/09/2013

Marcos Oliveira

Bom dia Minotti.
Só pra deixar mais claro, esse "Map" que você está usando o que é? Classes, componentes, etc?
Qual banco você usa?

Att,

Marcos
Responder

Gostei + 0

10/09/2013

Marlon Minotti

O map é um mapeamento que fiz em um form para que ele pegue todos os edits, combobox, labelededit e afins...
Estou usando postgresql

Se ainda tiver duvidas sobre o map eu coloco os códigos de como ele esta funcionando aqui pra voce ver.
Responder

Gostei + 0

10/09/2013

Marcos Oliveira

Minotti, teria como você postar o erro, exatamente como ele aparece?

Att,

Marcos
Responder

Gostei + 0

10/09/2013

Marlon Minotti

Project Easy Solutions.exe raised exception class EConvertError with message "1.123,12" is not a valid floating point value.
Responder

Gostei + 0

10/09/2013

Marcos Oliveira

Minotti, o problema pode estar no separador de milhar do valor "1.123,12".
Quando vou gravar no PostgresSQL, eu formato o valor para "1123.12".
Já tive problemas ao gravar o ponto decimal como vírgula. E pra resolver, formatei toda minha gravação, retirando o separador de milhar, e trocando o separador de decimal de vírgula para ponto.

Att,

Marcos
Responder

Gostei + 0

10/09/2013

Marlon Minotti

Mas eu nao tenho problemas com a virgula no decimal, eu tenho problemas com o ponto na casa de milhares... Perceba que eu usei StringReplace para ver se eu conseguia resolver esse problema mas mesmo assim é pertinente. Voce recomendaria eu usar um FormatFloat?
Responder

Gostei + 0

10/09/2013

Marcos Oliveira

Pela mensagem de erro que você passou, o seu ponto de milhar continua presente no valor. Verifique se sua rotina para trocar o ponto por vazio está funcionando.
Ou então o erro pode estar em outro ponto do seu projeto, como no "else", por exemplo. A melhor forma de saber é depurando. Você sabe me dizer se o erro está na linha onde você colocou o StringReplace?
Responder

Gostei + 0

10/09/2013

Marlon Minotti

Sim, quando ele da o erro, ele me aponta para a linha do StringReplace
Responder

Gostei + 0

10/09/2013

Marcos Oliveira

A sua função "valorDoComponente" faz o quê? Já verificou se o problema não é nela?
Responder

Gostei + 0

10/09/2013

Marlon Minotti

O valorDoComponente identifica qual o tipo de componente que eu estou "pegando" olhe o código:
function TfrmPadraoCadastro.valorDoComponente(obj: TObject;
  tipoDado: TFieldType): Variant;
var
  aux: String;
begin
  if (obj is TCustomEdit) then
  begin
    aux := TCustomEdit(obj).Text;
  end
  else if (obj is TCustomComboBox) then
  begin
    aux := TComboBox(obj).Text;
  end;

  case tipoDado of ftString, ftWideString: result := aux;
    ftSmallint, ftInteger, ftWord, ftLargeint: result := StrToInt(aux);
    ftFloat, ftCurrency: result := StrToFloat(aux);
    ftDate, ftTime, ftDateTime: result := StrToDateTime(aux);
  end;
end;
Responder

Gostei + 0

10/09/2013

Marcos Oliveira

Você já colocou um break-point nessa sua função pra ver se o problema não está nela?

Att,

Marcos
Responder

Gostei + 0

10/09/2013

Marlon Minotti

Muito obrigado pela atenção Marcos, voce foi muito atencioso.

Eu e um amigo de serviço aqui analisamos e vimos que a ideia estava correta, porém o lugar estava errado... eu tive que colocar o StringReplace dentro da função valorDoComponente quando ele fosse float, repare:
function TfrmPadraoCadastro.valorDoComponente(obj: TObject;
  tipoDado: TFieldType): Variant;
var
  aux: String;
begin
  if (obj is TCustomEdit) then
  begin
    aux := TCustomEdit(obj).Text;
  end
  else if (obj is TCustomComboBox) then
  begin
    aux := TComboBox(obj).Text;
  end;

  case tipoDado of ftString, ftWideString: result := aux;
    ftSmallint, ftInteger, ftWord, ftLargeint: result := StrToInt(aux);
    ftFloat, ftCurrency: result := StrToFloat(StringReplace(aux, '.', '', [rfReplaceAll, rfIgnoreCase]));
    ftDate, ftTime, ftDateTime: result := StrToDateTime(aux);
  end;
end;


Muito obrigado pela atenção...
Responder

Gostei + 0

10/09/2013

Marcos Oliveira

Por nada! Estou aqui pra ajudar! Abraço.
Responder

Gostei + 0

10/09/2013

José

Tendo entendido que a duvida foi sanada, estou finalizando o tópico.
Caso necessário basta pedir para reabrir este tópico ou fique a vontade para criar um novo tópico.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar