GARANTIR DESCONTO

Fórum Is not a valid floating point value #343605

24/07/2007

0

Como faz para resolver esse tipo de problema:

Is not a valid floating point value.


Jpauloss

Jpauloss

Responder

Posts

24/07/2007

Jáder Medeiros

Detalhe mais o que fez dar este erro.


Responder

Gostei + 0

25/07/2007

Jax

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.


Responder

Gostei + 0

25/07/2007

Jpauloss

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?


Responder

Gostei + 0

25/07/2007

Jax

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 := ´.´;



Responder

Gostei + 0

27/07/2007

Djjunior

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


Responder

Gostei + 0

30/07/2007

Jax

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.


Responder

Gostei + 0

30/07/2007

Emerson Nascimento

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;



Responder

Gostei + 0

30/07/2007

Jax

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.


Responder

Gostei + 0

30/07/2007

Jax

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


Responder

Gostei + 0

31/07/2007

Jpauloss

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?


Responder

Gostei + 0

31/07/2007

Jpauloss

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;
-----------------------------------------------------------------------------------


Responder

Gostei + 0

01/08/2007

Ricardo_ascii

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


Responder

Gostei + 0

01/08/2007

Emerson Nascimento

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.


Responder

Gostei + 0

01/08/2007

Jpauloss

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?


Responder

Gostei + 0

02/08/2007

Jáder Medeiros

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.


Responder

Gostei + 0

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

Aceitar