Is not a valid floating point value

Delphi

24/07/2007

Como faz para resolver esse tipo de problema:

Is not a valid floating point value.


Jpauloss

Jpauloss

Curtidas 0

Respostas

Jáder Medeiros

Jáder Medeiros

24/07/2007

Detalhe mais o que fez dar este erro.


GOSTEI 0
Jax

Jax

24/07/2007

Teste o seguinte:
procedure TForm1.Button1Click(Sender: TObject);
var
  V : Double;
begin
  V := StrToFloat(StringReplace(Edit1.Text, ´,´, DecimalSeparator, []));
end;


O segundo parametro do StringReplace indica o caracter que está incorreto, ou seja, vc está passando uma virgula aonde deveria ser ponto por exemplo.


GOSTEI 0
Jpauloss

Jpauloss

24/07/2007

Teste o seguinte:
procedure TForm1.Button1Click(Sender: TObject);
var
  V : Double;
begin
  V := StrToFloat(StringReplace(Edit1.Text, ´,´, DecimalSeparator, []));
end;
O segundo parametro do StringReplace indica o caracter que está incorreto, ou seja, vc está passando uma virgula aonde deveria ser ponto por exemplo.


Então Fica assim:

procedure TForm1.Button1Click(Sender: TObject);
var
  V : Double;
begin
  V := StrToFloat(StringReplace(Edit1.Text, ´,´, ´.´, []));
end;


Isso mesmo? Outra coisa como faço para o banco entender vígula ao invés de ponto?


GOSTEI 0
Jax

Jax

24/07/2007

Em instruções SQL deve-se sempre usar o ponto.

já no seu aplicativo vc pode definir manualmente o separador decimal (DecimalSeparator) que desejar.

DecimalSeparator := ´.´;



GOSTEI 0
Djjunior

Djjunior

24/07/2007

eu criei uma função minha do tipo:

function MeuStrToFloat(s: string): Extended;
begin
Result := 0;
try
if s = ´´ then
begin
s := ´0´;
exit;
end;

Result := StrToFloat(AnsiReplaceStr(s, ThousandSeparator, ´´));
except
messageDlg(Format(´Valor ¬S Não é um valor valido´), [s]), True);
end;
end;

desta forma sempre que preciso do StrToFloat uso o MeuStrToFloat ai é só fazer o mesmo com o strToInt


GOSTEI 0
Jax

Jax

24/07/2007

Caro Colega,

Você sabe o que é o ThousandSeparator?

ThousandSeparator é o separador de milhares e pode variar dependendo das configurações regionais do sistema operacional em que o programa estiver rodando.

Desaconselho o uso de ThousandSeparator, porque se o windows for PT-BR, ThousandSeparator será o Ponto. Já em EN-US o ThousandSeparator será a virgula.

Ex:
PT-BR: 1.121.956,85
EN-US: 1,121,956.85

Melhore sua função para evitar problemas futuramente.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/07/2007

JAX, a função do djjunior está correta. ela está [b:23a3a2c360]retirando[/b:23a3a2c360] o separador de milhar (ThousandSeparator) da string.
function MeuStrToFloat(s: string): Extended;
begin
  Result := 0;
  try
    if s = ´´ then
      s := ´0´;

    Result := StrToFloat(AnsiReplaceStr(s, ThousandSeparator, ´´));
  except
    messageDlg(Format(´Valor ¬S Não é um valor valido´), [s]), True);
  end;
end;



GOSTEI 0
Jax

Jax

24/07/2007

Até o momento ok.
Remove o separador de milhares.
Só que o problema geralmente não é o separador de milhares porque na maioria das vezes o separador de milhares não é utilizado.
Mas e quando o separador decimal for ponto e vc passar uma virgua?
Ou vice-versa?

Uma solução possível:

function MeuStrToFloat(Str : string; Def : Double = 0) : Double; 
var
  Ch : Char;
begin 
  Ch := DecimalSeparator;
  try
    DecimalSeparator := ´,´;
    Result := StrtToFloatDef(Trim(Str), Def);
  finally
    DecimalSeparator := Ch;
  end;
end; 


É claro que vc tem que ter certeza de que sempre o separador decimal vai ser a virgula nesse caso.

Desculpen qualquer coisa.

Espero ter colaborado.


GOSTEI 0
Jax

Jax

24/07/2007

Deculpem, sobrou um t:
StrtToFloatDef ----> StrToFloatDef


GOSTEI 0
Jpauloss

Jpauloss

24/07/2007

Até o momento ok. Remove o separador de milhares. Só que o problema geralmente não é o separador de milhares porque na maioria das vezes o separador de milhares não é utilizado. Mas e quando o separador decimal for ponto e vc passar uma virgua? Ou vice-versa? Uma solução possível:
function MeuStrToFloat(Str : string; Def : Double = 0) : Double; 
var
  Ch : Char;
begin 
  Ch := DecimalSeparator;
  try
    DecimalSeparator := ´,´;
    Result := StrtToFloatDef(Trim(Str), Def);
  finally
    DecimalSeparator := Ch;
  end;
end; 
É claro que vc tem que ter certeza de que sempre o separador decimal vai ser a virgula nesse caso. Desculpen qualquer coisa. Espero ter colaborado.


Vou dispara essa function aonde?


GOSTEI 0
Jpauloss

Jpauloss

24/07/2007

Estou tentando declarar na unit da dm mas ta dando um erro, não estou sabendo fazer certo. Minha unit vai aí:
----------------------------------------------------------------------------------
unit U_DM;

interface

uses
SysUtils, Classes, DBXpress, FMTBcd, Provider, DBClient, DB, SqlExpr, SimpleDS;

type
.....

private
{ Private declarations }
public
{ Public declarations }
function MeuStrtoFloat : Double;

end;

var
DM: TDM;

implementation

{$R *.dfm}

function MeuStrToFloat(Str : string; Def : Double = 0) : Double;
var
Ch : Char;
begin
Ch := DecimalSeparator;
try
DecimalSeparator := ´,´;
Result := StrToFloatDef(Trim(Str), Def);
finally
DecimalSeparator := Ch;
end;
end;
end.
-----------------------------------------------------------------------------------

Está dando erro na criação dessa function.
Erro:

[Pascal Error] U_DM.pas(43): E2065 Unsatisfied forward or external declaration: ´TDM.MeuStrtoFloat´

Esse erro é da linha:

function MeuStrtoFloat : Double;
-----------------------------------------------------------------------------------


GOSTEI 0
Ricardo_ascii

Ricardo_ascii

24/07/2007

if not dm.query1.fieldbyname(´valor´).isnull then
variavel:=dm.query1.fieldbyname(´valor´).value;


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/07/2007

o erro aconteceu porque você declarou a função como um método do form, mas não a criou assim.
você tem duas formas de resolver o problema:
1. retire a [i:bc376650bc]declaração da função*[/i:bc376650bc] da seção [i:bc376650bc]public[/i:bc376650bc] e a coloque imediatamente antes de [i:bc376650bc]implementation[/i:bc376650bc] ou
2. na implementação da função altere o cabeçalho para
function [b:bc376650bc]TDM.[/b:bc376650bc]MeuStrToFloat(Str : string; Def : Double = 0) : Double;
type TDM = class( ... )
.....
  private
    {Private declarations}
  public
    {Public declarations}
    function MeuStrToFloat(Str : string; Def : Double = 0) : Double;
  end;

var
  DM: TDM;

implementation

{$R *.dfm}

function TDM.MeuStrToFloat(Str : string; Def : Double = 0) : Double;
var
  Ch : Char;
begin
  Ch := DecimalSeparator;
  try
    DecimalSeparator := ´,´;
    Result := StrToFloatDef(Trim(Str), Def);
  finally
    DecimalSeparator := Ch;
  end;
end;

end.


* a declaração da função estava errada. o cabeçalho tem que ficar igual aquele da implementação.


GOSTEI 0
Jpauloss

Jpauloss

24/07/2007

o erro aconteceu porque você declarou a função como um método do form, mas não a criou assim. você tem duas formas de resolver o problema: 1. retire a [i:f29a480d0e]declaração da função*[/i:f29a480d0e] da seção [i:f29a480d0e]public[/i:f29a480d0e] e a coloque imediatamente antes de [i:f29a480d0e]implementation[/i:f29a480d0e] ou 2. na implementação da função altere o cabeçalho para function [b:f29a480d0e]TDM.[/b:f29a480d0e]MeuStrToFloat(Str : string; Def : Double = 0) : Double;
type TDM = class( ... )
.....
  private
    {Private declarations}
  public
    {Public declarations}
    function MeuStrToFloat(Str : string; Def : Double = 0) : Double;
  end;

var
  DM: TDM;

implementation

{$R *.dfm}

function TDM.MeuStrToFloat(Str : string; Def : Double = 0) : Double;
var
  Ch : Char;
begin
  Ch := DecimalSeparator;
  try
    DecimalSeparator := ´,´;
    Result := StrToFloatDef(Trim(Str), Def);
  finally
    DecimalSeparator := Ch;
  end;
end;

end.
* a declaração da função estava errada. o cabeçalho tem que ficar igual aquele da implementação.


Aonde vou disparar essa function? No evento onexit do edit em questão?
Outra coisa como vou fazer para chamar essa function em outro form?


GOSTEI 0
Jáder Medeiros

Jáder Medeiros

24/07/2007

Aonde vou disparar essa function? No evento onexit do edit em questão?

[b:e2c0e1e432]Sugiro no evento OnSetText do Field.[/b:e2c0e1e432]

Outra coisa como vou fazer para chamar essa function em outro form?

[b:e2c0e1e432]Para chamar a função em outro Form, basta você invocar como:[/b:e2c0e1e432]
DM.MeuStrToFloat

Lembrando que a variável DM deve ter um objeto instanciado.


GOSTEI 0
POSTAR